Menangani titik dua dalam elemen ID dengan jQuery

145

Kami tidak dapat mengakses elemen div dengan ID "test: abc" dalam kode JS menggunakan jQuery.

<div id="test:abc">

$('#test:abc') 

Ini bekerja dengan baik tanpa titik dua. Kami tidak memiliki kontrol pada pembuatan ID karena dibuat secara otomatis di sub-form Trinidad karena ia melampirkan sub-form ID dengan :setiap elemen di dalamnya.

Amit Singh
sumber
pada dasarnya itu baik tidak ada yang diterima, karena jawaban terbaik akhirnya bukan yang teratas (petunjuk: periksa jawaban saya)
Toskan
Saya senang Anda menemukan solusinya, sub formulir Trinidad perlu memilah konvensi penamaan mereka.
Jack Tuck
IBM Domino (xpages) melakukan hal yang sama. Ini benar-benar jquery itulah masalahnya, mengingat bahwa titik dua adalah teks ID yang sah.
user2808054

Jawaban:

209

Anda perlu keluar dari usus besar menggunakan dua garis miring:

$('#test\\:abc')
neknik
sumber
85

Pendeknya

$(document.getElementById("test:abc")) adalah apa yang harus Anda gunakan.

Penjelasan : Selain dari kenaikan kecepatan (lihat lebih jauh ke bawah), lebih mudah untuk ditangani.

Contoh: Katakan Anda memiliki fungsi

   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); 

Kecepatan / waktu

lihat jsbin ini yang menguji dan membandingkan kecepatan metode pemilihan ID dengan titik dua

Anda perlu membuka konsol pembakar Anda untuk mendapatkan hasilnya.

Saya mengujinya dengan firefox 10 dan jquery 1.7.2

pada dasarnya saya melakukan pilih 10'000 kali div dengan titik dua di id - dengan metode yang berbeda untuk mencapainya. Kemudian saya membandingkan hasil dengan pemilihan ID tanpa titik dua di dalamnya, hasilnya cukup mengejutkan.

Waktu tersisa dalam metode pemilih kanan ms

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

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

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


71 $("#nocolon")

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

terutama

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

datang sedikit sebagai kejutan

Toskan
sumber
3
Ini sangat berguna dan harus lebih ditingkatkan. Meskipun ini, $ ("[id = 'annoying: colon']", berfungsi. Document.getElementById tampaknya menjadi apa yang harus digunakan.
Irwin
4
Cukup menggunakan kode yang lebih rumit untuk mengarsipkan hasil yang sama hanya karena lebih cepat adalah kasus optimasi prematur. Anda harus selalu lebih suka kode yang dapat dibaca daripada kode cepat kecuali itu adalah hambatan kinerja. Atau dalam kata Wiliam Wulf : "Lebih banyak dosa perhitungan dilakukan atas nama efisiensi (tanpa harus mencapainya) daripada untuk alasan tunggal lainnya - termasuk kebodohan buta." Info lebih lanjut di sini .
nfechner
3
Tampaknya lebih baik dengan jQuery yang lebih baru (2.1.1): 32 $("#annyoing\\:colon") , 29 $("[id='annyoing:colon']") , 5 $(document.getElementById("annyoing:colon")) , 8 $("#nocolon") , 31 $("[id='nocolon']")
Möhre
@ Möhre senang mendengarnya. Sayangnya IE8 masih menjadi masalah (dan tidak didukung oleh jQuery 2). Tetapi hitungan mundur untuk IE8 sedang berlangsung theie8countdown.com
Toskan
1
@nfechner. Apa yang lebih mudah dibaca menurut Anda? $("#annoying\\:colon")atau $(document.getElementById("annoying:colon"))?
Jakub Godoniuk
29

Jelas tersandung pada titik dua, karena jQuery mencoba menafsirkannya sebagai pemilih. Coba gunakan pemilih atribut id.

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

Saya hanya akan menggunakan document.getElementById, dan meneruskan hasilnya ke jQuery()fungsi.

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

gunakan dua backslash \\

DEMO

seperti yang tertulis di sini

Jika Anda ingin menggunakan salah satu meta-karakter (seperti! "# $% & '() * +,. / :; <=>? @ [] ^` {|} ~) Sebagai bagian literal dari nama, Anda harus keluar dari karakter dengan dua garis miring terbalik: \. Misalnya, jika Anda memiliki elemen dengan id = "foo.bar", Anda dapat menggunakan pemilih $ ("# foo \ .bar"). Spesifikasi W3C CSS berisi lengkap

Referensi

diEcho
sumber
4

Mengacu pada jawaban Toskan, saya memperbarui kodenya untuk membuatnya sedikit lebih mudah dibaca dan kemudian output ke halaman.

Inilah tautan jbin: http://jsbin.com/ujajuf/14/edit .



Juga, saya menjalankannya dengan lebih banyak iterasi

Iterations:1000000

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

Bahkan Lebih:

Iterations:10000000

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

coba gunakan $('#test\\:abc')

Mithun Sreedharan
sumber
1

Sintaks ini $('[id="test:abc"]') bekerja untuk saya. Saya menggunakan Netbeans 6.5.1& menghasilkan komponen dengan idyang berisi a : (colon). Saya mencoba \\& amp; \3Atetapi tidak satupun dari mereka bekerja.

JVR
sumber
0

Gunakan $('[id=id:with:colon]').

zindel
sumber