JQuery ile öğe kimliğinde iki nokta üst üste işleme


146

JQuery kullanarak JS kodunda "test: abc" kimliğine sahip div öğesine erişemiyoruz.

<div id="test:abc">

$('#test:abc') 

Kolon olmadan iyi çalışıyor. Trinidad alt formlarında otomatik olarak oluşturulduğundan kimlik oluşturma üzerinde kontrole sahip değiliz çünkü :içindeki her öğeye alt form kimliği ekliyor .


: En iyi yanıt üst puan bir (benim cevap kontrol ipucu) sonunda olmadığından temelde iyi bir şey, kabul edildi edilir
Toskan

Bir çözüm bulduğunuza sevindim, Trinidad alt formlarının adlandırma kurallarını çözmesi gerekiyor.
Jack

IBM Domino (xpages) aynı şeyi yapar. İki nokta üst üste işaretinin yasal kimlik metni olduğu düşünüldüğünde, sorun gerçekten jquery'dir.
user2808054

Yanıtlar:


209

İki ters eğik çizgi kullanarak iki noktadan kaçmanız gerekir:

$('#test\\:abc')

86

Kısacası

$(document.getElementById("test:abc")) kullanmanız gereken şey.

Açıklama : Hız kazanımının yanı sıra (aşağıya bakın), kullanımı daha kolaydır.

Örnek: Bir fonksiyonunuz olduğunu varsayalım

   function doStuff(id){

       var jEle = $("#" + id); //is not safe, since id might be "foo:bar:baz" and thus fail. 
       //You would first have to look for ":" in the id string, then replace it

       var jEle = $(document.getElementById(id)); //forget about the fact 
      //that the id string might contain ':', this always works
    }

    //just to give an idea that the ID might be coming from somewhere unkown
    var retrievedId = $("foo").attr("data-target-id");
    doStuff(retrievedId); 

Hız / Zamanlama

ID'lerin seçim yöntemlerinin hızını iki nokta üst üste ile test eden ve karşılaştıran bu jsbin'e bir göz atın

sonuçları almak için firebug konsolunuzu açmanız gerekir.

Firefox 10 ve jquery 1.7.2 ile test ettim

temelde id'de iki nokta üst üste ile seçili 10.000 kez bir div yaptım - bunu başarmak için farklı yöntemlerle. Sonra sonuçları içinde iki nokta üst üste bulunmayan bir kimlik seçimiyle karşılaştırdım, sonuçlar oldukça şaşırtıcı.

ms cinsinden sol süre sağ seçici yöntemi

299 $("#annoying\\:colon")

302 $("[id='annoying:colon']"

20 $(document.getElementById("annoying:colon"))


71 $("#nocolon")

294 $("[id='nocolon']")

özellikle

  71 $("#nocolon") and
299 $("#annoying\\:colon")

biraz sürpriz geliyor


3
Bu gerçekten yararlıdır ve daha fazla oy verilmelidir. Buna rağmen, $ ("[id = 'sinir bozucu: kolon']" işe yarıyor. Document.getElementById kullanılması gereken şey gibi görünüyor.
Irwin

4
Aynı sonucu arşivlemek için daha karmaşık bir kod kullanmak, daha hızlı olduğu için erken optimizasyon durumudur. Bir performans darboğazı olmadığı sürece her zaman hızlı kod yerine okunabilir kodu tercih etmelisiniz. Ya da Wiliam Wulf'un sözleriyle : "Verimlilik adına (bunu başarmak zorunda kalmadan), diğer herhangi bir nedenden - kör aptallık da dahil olmak üzere - daha fazla bilgi işlem günahı işlenir." Daha fazla bilgi burada .
nfechner

3
Yeni jQuery (2.1.1) ile daha iyi görünüyor: 32 $("#annyoing\\:colon") , 29 $("[id='annyoing:colon']") , 5 $(document.getElementById("annyoing:colon")) , 8 $("#nocolon") , 31 $("[id='nocolon']")
Möhre

@ Möhre bunu duymak güzel. Ne yazık ki IE8 hala bir sorun (ve jQuery 2 tarafından desteklenmiyor). Ancak IE8 için geri sayım devam ediyor theie8countdown.com
Toskan

1
@nfechner. Sizce daha okunaklı ne var? $("#annoying\\:colon")veya $(document.getElementById("annoying:colon"))?
Jakub Godoniuk

30

Açıkçası, kolonda takılıyor, çünkü jQuery onu bir seçici olarak yorumlamaya çalışıyor. İd özniteliği seçiciyi kullanmayı deneyin.

 $('[id="test:abc"]')

9

Ben sadece kullanırdım document.getElementByIdve sonucu jQuery()işleve aktarırdım.

var e = document.getElementById('test:abc');
$(e) // use $(e) just like $('#test:abc') 

7

iki ters eğik çizgi kullanın \\

DEMO

burada yazıldığı gibi

Meta karakterlerden herhangi birini (! "# $% & '() * +,. / :; <=>? @ [] ^` {|} ~ Gibi) bir metnin değişmez bir parçası olarak kullanmak isterseniz adı, iki ters eğik çizgiyle karakterden kaçmalısınız: \. Örneğin, id = "foo.bar" olan bir öğeniz varsa, $ ("# foo \ .bar") seçicisini kullanabilirsiniz. tam içerir

Referans


4

Toskan'ın cevabına atıfta bulunarak, kodunu biraz daha okunabilir hale getirmek için güncelledim ve ardından sayfaya çıktı.

İşte jbin bağlantısı: http://jsbin.com/ujajuf/14/edit .



Ayrıca, daha fazla yinelemeyle çalıştırdım

Iterations:1000000

Results:    
12794   $("#annyoing\\:colon")
12954   $("[id='annyoing:colon']"
754 $(document.getElementById("annyoing:colon"))
3294    $("#nocolon")
13516   $("[id='nocolon']")

Hatta daha fazla:

Iterations:10000000

Results:    
137987  $("#annyoing\\:colon")
140807  $("[id='annyoing:colon']"
7760    $(document.getElementById("annyoing:colon"))
32345   $("#nocolon")
146962  $("[id='nocolon']")


1

Bu sözdizimi $('[id="test:abc"]') benim için çalıştı. Ben kullanıyorum Netbeans 6.5.1ve idbir : (colon). Denedim \\& \3Aancak bunların hiçbiri çalıştı.


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.