Обработка двоеточия в идентификаторе элемента с помощью jQuery

145

Мы не можем получить доступ к элементу div с идентификатором «test: abc» в коде JS, используя jQuery.

<div id="test:abc">

$('#test:abc') 

Работает нормально без двоеточия. У нас нет контроля над генерацией идентификатора, так как он автоматически генерируется в подформах Тринидада, потому что он прикрепляет идентификатор под формы с :каждым элементом внутри него.

Амит Сингх
источник
в основном это хорошо, что ничего не было принято, потому что лучший ответ в конечном итоге не самый лучший (подсказка: проверьте мой ответ)
Toskan
Я рад, что вы нашли решение, подвидам Тринидада нужно разобраться в их соглашениях об именах.
Джек Так
IBM Domino (xpages) делает то же самое. Это действительно jquery, это проблема, учитывая, что двоеточие является легитимным идентификатором текста.
user2808054

Ответы:

209

Вы должны избежать двоеточия, используя две косые черты:

$('#test\\:abc')
nfechner
источник
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

в основном я выбрал 10'000 раз деления с двоеточием в идентификаторе - разными способами для достижения этого. Затем я сравнил результаты с выбором идентификатора без двоеточия, результаты довольно удивительны.

оставленное время в мс

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

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

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


71 $("#nocolon")

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

особенно

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

немного удивительно

Toskan
источник
3
Это действительно полезно и должно быть одобрено больше. Даже при том, что это, $ ("[id = 'annoying: двоеточие']", работает. Кажется, что следует использовать 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
@ Море, приятно слышать. К сожалению, IE8 все еще является проблемой (и не поддерживается jQuery 2). Но обратный отсчет времени для IE8 продолжается theie8countdown.com
Toskan
1
@nfechner. Что на ваш взгляд более читабельно? $("#annoying\\:colon")или $(document.getElementById("annoying:colon"))?
Якуб Годонюк
29

Очевидно, что он срабатывает на двоеточие, потому что jQuery пытается интерпретировать его как селектор. Попробуйте использовать селектор атрибута id.

 $('[id="test:abc"]')
tvanfosson
источник
9

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

var e = document.getElementById('test:abc');
$(e) // use $(e) just like $('#test:abc') 
wsanville
источник
7

использовать две обратные косые черты \\

DEMO

как написано здесь

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

Ссылка

diEcho
источник
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']")
Ramsay
источник
3

попробуйте использовать $('#test\\:abc')

Митхун Шридхаран
источник
1

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

JVR
источник