Обробка двокрапки в ідентифікаторі елемента з jQuery


145

Ми не можемо отримати доступ до елемента div з ідентифікатором "test: abc" в JS-коді за допомогою jQuery.

<div id="test:abc">

$('#test:abc') 

Це добре працює без товстої кишки. У нас немає контролю над створенням ідентифікаторів, оскільки він автоматично генерується в підформулях Тринідаду, оскільки він приєднує ідентифікатор підформи :до кожного елемента всередині нього.


в основному добре, нічого не приймали, тому що найкраща відповідь - це врешті-решт не найкраще оцінена (підказка: перевірити мою відповідь)
Тоскан

Я радий, що ви знайшли рішення, для підрозділів Тринідаду необхідно розібратися в їхніх правилах іменування.
Джек Так

IBM Domino (xpages) робить те саме. Це справді проблема jquery, враховуючи, що двокрапка - це легітимний текст ідентифікатора.
user2808054

Відповіді:


209

Вам потрібно уникнути товстої кишки за допомогою двох зворотних нахилів:

$('#test\\:abc')

85

Коротко

$(document.getElementById("test:abc")) це те, що вам слід використовувати.

Пояснення : Окрім збільшення швидкості (див. Далі), з цим легше керувати.

Приклад: скажіть, що у вас є функція

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

Швидкість / час

подивіться на це jsbin, який тестує та порівнює швидкість методів вибору ідентифікаторів з колонами

вам потрібно відкрити консоль firebug, щоб отримати результати.

Я перевірив це за допомогою firefox 10 та jquery 1.7.2

в основному я зробив кілька тисяч разів діва з двокрапкою в ід - з різними методами, щоб досягти цього. Тоді я порівнював результати з виділенням ідентифікатора, в ньому немає двокрапки, результати є досить дивними.

лівий час у мс-методі правого вибору

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

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

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


71 $("#nocolon")

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

особливо

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

приходить трохи як сюрприз


3
Це дійсно корисно і слід більше звертати увагу на нього. Незважаючи на те, що $ ("[id = 'дратує: двокрапка']") працює. Document.getElementById, здається, є те, що слід використовувати.
Ірвін

4
Просто використовувати складніший код для архівування того ж результату лише тому, що це швидше - це справа передчасної оптимізації. Ви завжди повинні віддавати перевагу читабельному коду над швидким кодом, якщо це не вузьке місце. Або словом Віліама Вульфа : «Більше обчислювальних гріхів вчиняється в ім’я ефективності (не обов'язково досягаючи цього), ніж з будь-якої іншої причини - включаючи сліпу дурість». Більше інформації тут .
nfechner

3
Здається, новіші jQuery (2.1.1): 32 $("#annyoing\\:colon") , 29 $("[id='annyoing:colon']") , 5 $(document.getElementById("annyoing:colon")) , 8 $("#nocolon") , 31 $("[id='nocolon']")
Möhre

@ Möhre це добре чути. На жаль, IE8 все ще залишається проблемою (і не підтримується jQuery 2). Але зворотний відлік для IE8 триває theie8countdown.com
Тоскан

1
@nfechner. Що можна зрозуміти на вашу думку? $("#annoying\\:colon")або $(document.getElementById("annoying:colon"))?
Якуб Годонюк

29

Очевидно, що це спрацьовує на товстій кишці, тому що jQuery намагається інтерпретувати її як селектор. Спробуйте скористатися засобом вибору атрибута id.

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

9

Я просто використовував би document.getElementByIdі передав результат jQuery()функції.

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

7

використовувати два нахили \\

DEMO

як написано тут

Якщо ви хочете використовувати будь-який з мета-символів (наприклад,! "# $% & '() * +,. /:; <=>? @ [] ^` {|} ~) Як буквальну частину name, ви повинні уникнути символу з двома зворотними косими рисами: \. Наприклад, якщо у вас є елемент з id = "foo.bar", ви можете використовувати селектор $ ("# foo \ .bar"). Специфікація CS3 W3C містить повне

Довідково


4

Посилаючись на відповідь Тоскана, я оновив його код, щоб зробити його трохи читабельнішим, а потім вивів на сторінку.

Ось посилання jbin: http://jsbin.com/ujajuf/14/edit .



Крім того, я запустив це з більшою кількістю ітерацій

Iterations:1000000

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

Навіть більше:

Iterations:10000000

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


1

Цей синтаксис $('[id="test:abc"]') працював на мене. Я використовую Netbeans 6.5.1& він генерує компоненти, idщо містять a : (colon). Я спробував \\& the, \3Aале жоден з них не працював.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.