Obsługa dwukropka w identyfikatorze elementu za pomocą jQuery

145

Nie możemy uzyskać dostępu do elementu div o identyfikatorze „test: abc” w kodzie JS przy użyciu jQuery.

<div id="test:abc">

$('#test:abc') 

Działa dobrze bez okrężnicy. Nie mamy kontroli nad generowaniem identyfikatora, ponieważ jest on generowany automatycznie w formularzach podrzędnych Trinidad, ponieważ dołącza identyfikator formularza podrzędnego :do każdego elementu w nim zawartego.

Amit Singh
źródło
w zasadzie dobrze, że nic nie zostało zaakceptowane, ponieważ ostatecznie najlepsza odpowiedź nie jest najwyżej oceniona (wskazówka: sprawdź moją odpowiedź)
Toskan
Cieszę się, że znalazłeś rozwiązanie, formularze podrzędne Trinidad muszą uporządkować konwencje nazewnictwa.
Jack Tuck
IBM Domino (xpages) robi to samo. To naprawdę jQuery jest problemem, biorąc pod uwagę, że dwukropek jest prawidłowym tekstem identyfikacyjnym.
user2808054

Odpowiedzi:

209

Musisz uciec z dwukropka za pomocą dwóch ukośników:

$('#test\\:abc')
nfechner
źródło
85

W skrócie

$(document.getElementById("test:abc")) jest tym, czego powinieneś użyć.

Wyjaśnienie : Oprócz przyrostu prędkości (patrz poniżej) jest łatwiejszy w obsłudze.

Przykład: załóżmy, że masz funkcję

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

Prędkość / czas

spójrz na ten plik jsbin, który testuje i porównuje szybkość metod wyboru identyfikatorów z dwukropkami

aby uzyskać wyniki, musisz otworzyć konsolę firebuga.

Przetestowałem to z Firefox 10 i jQuery 1.7.2

w zasadzie zrobiłem 10 000 razy div z dwukropkiem w id - z różnymi metodami, aby to osiągnąć. Następnie porównałem wyniki do selekcji ID bez dwukropka, wyniki są dość zaskakujące.

lewy czas w ms prawa metoda selektora

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

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

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


71 $("#nocolon")

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

szczególnie

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

jest trochę zaskoczeniem

Toskan
źródło
3
Jest to naprawdę przydatne i powinno być bardziej cenione. Mimo to, $ ("[id = 'denerwujący: dwukropek']", działa. Document.getElementById wydaje się być tym, czego należy użyć.
Irwin
4
Po prostu użycie bardziej skomplikowanego kodu do zarchiwizowania tego samego wyniku tylko dlatego, że jest szybszy, jest przypadkiem przedwczesnej optymalizacji. Zawsze powinieneś preferować czytelny kod od szybkiego kodu, chyba że jest to wąskie gardło wydajności. Lub słowem Wiliama Wulfa : „Więcej grzechów komputerowych popełnianych jest w imię wydajności (niekoniecznie do jej osiągnięcia) niż z jakiegokolwiek innego powodu - w tym ślepej głupoty”. Więcej informacji tutaj .
nfechner
3
Wydaje się, że jest lepiej z nowszym 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 to dobrze słyszeć. Niestety IE8 nadal stanowi problem (i nie jest obsługiwany przez jQuery 2). Ale odliczanie do IE8 trwa theie8countdown.com
Toskan
1
@nfechner. Co Twoim zdaniem jest bardziej czytelne? $("#annoying\\:colon")czy $(document.getElementById("annoying:colon"))?
Jakub Godoniuk
29

Oczywiście potyka się o okrężnicę, ponieważ jQuery próbuje zinterpretować to jako selektor. Spróbuj użyć selektora atrybutu id.

 $('[id="test:abc"]')
tvanfosson
źródło
9

Po prostu użyłbym document.getElementByIdi przekazał wynik do jQuery()funkcji.

var e = document.getElementById('test:abc');
$(e) // use $(e) just like $('#test:abc') 
wsanville
źródło
7

użyj dwóch odwrotnych ukośników \\

PRÓBNY

jak napisano tutaj

Jeśli chcesz użyć któregokolwiek z metaznaków (takich jak! "# $% & '() * +,. / :; <=>? @ [] ^` {|} ~) Jako części dosłownej nazwa, musisz zmienić znaczenie znaku dwoma ukośnikami odwrotnymi: \. Na przykład, jeśli masz element z id = "foo.bar", możesz użyć selektora $ ("# foo \ .bar"). Specyfikacja W3C CSS zawiera kompletny plik

Odniesienie

diEcho
źródło
4

Nawiązując do odpowiedzi Toskana, zaktualizowałem jego kod, aby był nieco bardziej czytelny, a następnie wyprowadziłem na stronę.

Oto link jbin: http://jsbin.com/ujajuf/14/edit .



Ponadto uruchomiłem go z większą liczbą iteracji

Iterations:1000000

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

Nawet więcej:

Iterations:10000000

Results:    
137987  $("#annyoing\\:colon")
140807  $("[id='annyoing:colon']"
7760    $(document.getElementById("annyoing:colon"))
32345   $("#nocolon")
146962  $("[id='nocolon']")
Ramsay
źródło
3

spróbuj użyć $('#test\\:abc')

Mithun Sreedharan
źródło
1

Ta składnia $('[id="test:abc"]') działała dla mnie. Używam Netbeans 6.5.1i generuje komponenty z rozszerzeniem, idktóre zawiera : (colon). Próbowałem \\& the, \3Aale żaden z nich nie działał.

JVR
źródło
0

Użyj $('[id=id:with:colon]').

zindel
źródło