Behandlung des Doppelpunkts in der Element-ID mit jQuery

145

Wir können mit jQuery nicht auf das div-Element mit der ID "test: abc" im JS-Code zugreifen.

<div id="test:abc">

$('#test:abc') 

Es funktioniert gut ohne Doppelpunkt. Wir haben keine Kontrolle über die ID-Generierung, da diese in Trinidad-Unterformularen automatisch generiert wird, da :jedem Element darin eine Unterformular-ID zugeordnet wird .

Amit Singh
quelle
Im Grunde ist es gut, dass nichts akzeptiert wurde, weil die beste Antwort letztendlich nicht die am besten bewertete ist (Hinweis: Überprüfen Sie meine Antwort)
Toskan
Ich bin froh, dass Sie eine Lösung gefunden haben. Trinidad-Unterformulare müssen ihre Namenskonventionen regeln.
Jack Tuck
IBM Domino (xpages) macht dasselbe. Es ist wirklich eine Frage, die das Problem ist, da ein Doppelpunkt ein legitimer ID-Text ist.
user2808054

Antworten:

209

Sie müssen dem Doppelpunkt mit zwei Schrägstrichen entkommen:

$('#test\\:abc')
nfechner
quelle
85

Zusamenfassend

$(document.getElementById("test:abc")) ist das, was Sie verwenden sollten.

Erläuterung : Abgesehen von der Geschwindigkeitssteigerung (siehe weiter unten) ist die Handhabung einfacher.

Beispiel: Angenommen, Sie haben eine Funktion

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

Geschwindigkeit / Timing

Schauen Sie sich diesen jsbin an, der die Geschwindigkeit der Auswahlmethoden von IDs mit Doppelpunkten testet und vergleicht

Sie müssen Ihre Firebug-Konsole öffnen, um die Ergebnisse zu erhalten.

Ich habe es mit Firefox 10 und jquery 1.7.2 getestet

Im Grunde habe ich 10'000 Mal eine Div mit einem Doppelpunkt in der ID ausgewählt - mit den verschiedenen Methoden, um dies zu erreichen. Dann habe ich die Ergebnisse mit einer ID-Auswahl ohne Doppelpunkt verglichen. Die Ergebnisse sind ziemlich überraschend.

linke Zeit in ms rechte Auswahlmethode

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

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

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


71 $("#nocolon")

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

insbesondere

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

kommt ein bisschen überraschend

Toskan
quelle
3
Dies ist wirklich nützlich und sollte mehr positiv bewertet werden. Auch wenn dies funktioniert, funktioniert $ ("[id = 'ärgerlich: Doppelpunkt']". Document.getElementById scheint das zu sein, was verwendet werden sollte.
Irwin
4
Die einfache Verwendung eines komplizierteren Codes zum Archivieren des gleichen Ergebnisses, nur weil es schneller ist, ist ein Fall vorzeitiger Optimierung. Sie sollten lesbaren Code immer schnellem Code vorziehen, es sei denn, es handelt sich um einen Leistungsengpass. Oder mit dem Wort von Wiliam Wulf : "Im Namen der Effizienz werden mehr Computersünden begangen (ohne sie unbedingt zu erreichen) als aus irgendeinem anderen Grund - einschließlich blinder Dummheit." Mehr Infos hier .
Nfechner
3
Scheint mit neuerem jQuery (2.1.1) besser zu sein: 32 $("#annyoing\\:colon") , 29 $("[id='annyoing:colon']") , 5 $(document.getElementById("annyoing:colon")) , 8 $("#nocolon") , 31 $("[id='nocolon']")
Möhre
@ Möhre das ist gut zu hören. Leider ist IE8 immer noch ein Problem (und wird von jQuery 2 nicht unterstützt). Aber der Countdown für IE8 läuft noch theie8countdown.com
Toskan
1
@nfechner. Was ist Ihrer Meinung nach besser lesbar? $("#annoying\\:colon")oder $(document.getElementById("annoying:colon"))?
Jakub Godoniuk
29

Es stolpert offensichtlich über den Doppelpunkt, weil jQuery versucht, ihn als Selektor zu interpretieren. Versuchen Sie es mit der ID-Attributauswahl.

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

Ich würde nur verwenden document.getElementByIdund das Ergebnis an die jQuery()Funktion übergeben.

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

Verwenden Sie zwei Backslash \\

DEMO

wie hier geschrieben

Wenn Sie eines der Metazeichen (wie! "# $% & '() * + ,. /:; <=>? @ [] ^` {|} ~) Als wörtlichen Teil von a verwenden möchten Name, Sie müssen das Zeichen mit zwei Backslashes maskieren: \. Wenn Sie beispielsweise ein Element mit id = "foo.bar" haben, können Sie den Selektor $ ("# foo \ .bar") verwenden. Die W3C-CSS-Spezifikation enthält das komplette

Referenz

diEcho
quelle
4

In Bezug auf Toskans Antwort habe ich seinen Code aktualisiert, um ihn etwas lesbarer zu machen, und ihn dann auf der Seite ausgegeben.

Hier ist der jbin-Link: http://jsbin.com/ujajuf/14/edit .



Außerdem habe ich es mit mehr Iterationen ausgeführt

Iterations:1000000

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

Sogar mehr:

Iterations:10000000

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

versuchen Sie es mit $('#test\\:abc')

Mithun Sreedharan
quelle
1

Diese Syntax $('[id="test:abc"]') hat bei mir funktioniert. Ich benutze Netbeans 6.5.1& es generiert Komponenten mit einem id, der a enthält : (colon). Ich habe das \\& das ausprobiert, \3Aaber keiner von ihnen hat funktioniert.

JVR
quelle
0

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

zindel
quelle