Kimlik bir nokta içerdiğinde jquery ile kimliğe göre html düğümleri nasıl seçilir?


178

Benim html böyle görünüyorsa:

<td class="controlCell">
    <input class="inputText" id="SearchBag.CompanyName" name="SearchBag.CompanyName" type="text" value="" />
</td>

JQuery ile # SearchBag.CompanyName'i nasıl seçebilirim? İşe yarayamıyorum ve her şeyi kıran noktadan korkuyorum. Can sıkıcı şey, tüm kimlikleri yeniden adlandırmak, okunabilirlikteki kayıptan bahsetmemek için çok iş olacak.

Not:
Lütfen tabloların yerleşim için nasıl oluşturulmadığı hakkında konuşmaya başlamayalım. CSS'nin değeri ve eksikliklerinin çok farkındayım ve mümkün olduğunca kullanmaya çalışıyorum.


1
Kimlikteki bir nokta geçerli bir HTML midir?
cletus

7
Evet. Kimlikler '-', '_', 'içerebilir.' ve ':'. w3.org/TR/html4/types.html#type-name
bobince

Jeps, asp.net mvc framework üreten çift <title> etiketi hariç tüm sayfaları doğrulamak ..
Boris Callens

Yanıtlar:


215

@Tomalak yorumlarda:

Kimlik seçicilerin önüne bir karma # eklenmelidir, burada belirsizlik olmamalıdır

“# İd.class”, hem id hem de ayrı bir sınıfın eşleşmesini gerektiren geçerli bir seçicidir; geçerlidir ve her zaman tamamen yedekli değildir.

Bir hazır bilgi '' seçmenin doğru yolu. CSS kaçmak için: "#id \ .moreid". Bu, bazı eski tarayıcılarda (özellikle IE5.x) sorunlara neden olur, ancak tüm modern masaüstü tarayıcıları bunu destekler.

Ben tam olarak test etmedi rağmen aynı yöntem jQuery 1.3.2 çalışıyor gibi görünüyor; quickExpr bunu almaz, ancak daha fazla dahil olan seçici ayrıştırıcı bunu doğru yapar gibi görünüyor:

$('#SearchBag\\.CompanyName');

1
"# id.class, hem id hem de ayrı bir sınıfın eşleşmesini gerektiren geçerli bir seçicidir": HTML spesifikasyonuna göre kimliklerin belge boyunca benzersiz olması gerekir. "# İd.class" ne işe yarar? Demek istediğim, "#id" den daha spesifik olamazsın, değil mi?
Tomalak

2
@Tom: “# id.class”, aynı stil sayfasını kullanan veya istemci tarafı komut dosyası içeren durumları ayarlayan birden çok belge için iyi olabilir. Örneğin “# navhome.navselected”.
bobince

@bobince: Evet, cletus aynı örnekle geldi ve sanırım geçerli. Yine de bana garip geliyor ve bunu yapabilmenin gerçek avantajını göremiyorum. Özellikle HTML ışığında kimlik noktalarına izin vermek ve bunu başarmak için her zaman ".navselected" kullanabilirsiniz.
Tomalak

Örneğin, seçilen bir # navhome öğesinin seçilen #navabout'tan farklı bir renkte yanmasını, ancak diğer .navselected özelliklerinin paylaşılmasını isteyebilirsiniz. Bu durumun her zaman ortaya çıktığını söyleyemem, ama ara sıra buna kesinlikle ihtiyacım vardı.
bobince

3
@Tomalak'ın cevabı daha zarif, sanırım:$('[id="profile.birthdate"]')
dr.dimitru

118

Bir varyant şu olurdu:

$("input[id='SearchBag.CompanyName']")

1
Aslında. Çözümünüzün neden işe yaradığını ve $ ("# SearchBag.CompanyName") neden işe yaramadığını söyleyebilir misiniz?
Boris Callens

9
Çünkü .ŞirketAdı sınıf seçici olarak değerlendirilir.
cletus

2
Kaynak koduna hızlıca bakıldığında, kasıtlı bir tasarım kararı veya bir hatadır. Kimlik seçicileri (quickExpr adlı) tanımlamak için kullanılan normal ifade, noktayı geçerli bir karakter olarak içermez. HTML özelliği buna izin verir.
Tomalak

5
Kimlik üzerinde bir sınıf seçiciye sahip olmak muhtemelen yararlıdır. Her sayfada #menu öğeniz olduğunu ancak sayfalarınızdan birinde farklı olmasını istediğinizi düşünün. # menu.hideme mesela? Marjinal biliyorum ama geçerli.
cletus

2
Bu açıkça üstün cevaptır. Bunun gibi değişkenlerle de çalışır: $ ("tr [id = '" + private_var + "']"). Css ("background-color", "#EEEEEE");
Steve K

33

Kullanırsanız hiçbir şeyden kaçmanıza gerek yoktur document.getElementById:

$(document.getElementById('strange.id[]'))

getElementById girdinin yalnızca bir id niteliği olduğunu varsayar; bu nedenle nokta, sınıf seçici olarak yorumlanmaz.


Düzgün bir çözüm, noktalar içerebilen dinamik kimlik ile de iyi çalışır
Cookalino

17

Kısa Yanıt : id = değerine sahip bir öğeniz "foo.bar"varsa seçiciyi kullanabilirsiniz$("#foo\\.bar")

Daha Uzun Cevap : Bu, burada bulabileceğiniz jquery belgelerinin - bölüm seçicilerinin bir parçasıdır: http://api.jquery.com/category/selectors/

Sorunuz doğrudan dokümantasyonun başında cevaplanmaktadır:

Meta karakterlerden herhangi birini (ör. 
! "# $% & '() * +,. /:;? @ [\] ^` {|} ~) 
bir ismin gerçek bir parçası olarak, 
iki ters eğik çizgi: \\. Örneğin, id = "foo.bar" olan bir öğeniz varsa,
$ ("# foo \\. bar") seçicisini kullanabilirsiniz. W3C CSS spesifikasyonu şunları içerir:
geçerli CSS seçicileriyle ilgili kuralların tamamı. Ayrıca yararlı
tanımlayıcılar için CSS karakter kaçış dizileri üzerinde Mathias Bynens tarafından yazılmış blog girişi.

4
Bu sorunun üç yıldan daha eski olduğunu ve belgelerin aynı olmayabilir, değil mi?
Reimius

9

kimliğiniz bir değişkende olduğunda attr seçimi uygun görünüyor:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');

4

Bu, jQuery seçici API'sında belgelenmiştir :

Meta-karakterler (örneğin herhangi birini kullanmak için !"#$%&'()*+,./:;<=>?@[\]^`{|}~bir isim bir hazır parçası olarak), iki ters eğik çizgi ile birlikte öncelenmelidirler: \\. Örneğin, ile bir öğe id="foo.bar"seçiciyi kullanabilir $("#foo\\.bar").

Kısacası, öneki .ile \\.

$('#SearchBag\\.CompanyName')

Sorun şu ki .bir sınıfla eşleşecek, yani $('#SearchBag.CompanyName')eşleşecekti <div id="SearchBag" class="CompanyName">. Kaçan karakter, özel bir önemi olmayan, arzu ettiğiniz kimlikle eşleşen \\.bir normal olarak ele alınacaktır ..

Bu !"#$%&'()*+,./:;<=>?@[\]^`{|}~, aksi takdirde jQuery'de seçici olarak özel bir öneme sahip olan tüm karakterler için geçerlidir .


2

Daha genel bir çözüm arayan çocuklar, herhangi bir özel karakterden önce bir ters eğik çizgi ekleyen bir çözüm buldum, bu özel karakterler içeren bir div'den isim ve kimlik alma ile ilgili sorunları çözüyor.

"Str1.str2% str3" .replace (/ [^ \ w \ s] / gi, '\\ $')

"Str1 \\. str2 \\% str3" değerini döndürür

Umarım faydalıdır!


1

Bir özellik seçici kullanabilirsiniz:

$("[id='SearchBag.CompanyName']");

Veya öğe türünü belirtebilirsiniz:

$("input[id='SearchBag.CompanyName']");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.