Manejo de dos puntos en ID de elemento con jQuery

145

No podemos acceder al elemento div con ID "test: abc" en código JS usando jQuery.

<div id="test:abc">

$('#test:abc') 

Funciona bien sin colon. No tenemos control sobre la generación de ID, ya que se genera automáticamente en subformularios de Trinidad porque adjunta ID de subformulario :a cada elemento dentro de él.

Amit Singh
fuente
básicamente es bueno, no se aceptó nada, porque la mejor respuesta eventualmente no es la mejor calificada (pista: verifique mi respuesta)
Toskan
Me alegra que hayas encontrado una solución, los subformularios de Trinidad deben resolver sus convenciones de nomenclatura.
Jack Tuck
IBM Domino (xpages) hace lo mismo. Es realmente jquery ese es el problema, dado que un colon es texto de identificación de legitemate.
user2808054

Respuestas:

209

Necesitas escapar del colon usando dos barras diagonales:

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

En breve

$(document.getElementById("test:abc")) es lo que debes usar.

Explicación : Además de la ganancia de velocidad (ver más abajo), es más fácil de manejar.

Ejemplo: digamos que tiene una función

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

Velocidad / sincronización

Eche un vistazo a este jsbin que prueba y compara la velocidad de los métodos de selección de ID con dos puntos.

necesitas abrir tu consola firebug para obtener los resultados.

Lo probé con firefox 10 y jquery 1.7.2

básicamente hice una selección de 10.000 veces de un div con dos puntos en la identificación, con los diferentes métodos para lograrlo. Luego comparé los resultados con una selección de ID sin dos puntos, los resultados son bastante sorprendentes.

tiempo restante en el método selector de ms derecho

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

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

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


71 $("#nocolon")

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

especialmente

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

viene un poco como sorpresa

Toskan
fuente
3
Esto es realmente útil y debería ser votado más. Aunque esto, $ ("[id = 'molesto: dos puntos']", funciona. Document.getElementById parece ser lo que debería usarse.
Irwin
44
Simplemente usar un código más complicado para archivar el mismo resultado solo porque es más rápido es un caso de optimización prematura. Siempre debe preferir el código legible sobre el código rápido a menos que sea un cuello de botella de rendimiento. O en palabras de Wiliam Wulf : "Se cometen más pecados informáticos en nombre de la eficiencia (sin necesariamente lograrlo) que por cualquier otra razón, incluida la estupidez ciega". Más información aquí .
nfechner
3
Parece ser mejor con la nueva 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, eso es bueno de escuchar. Lamentablemente, IE8 sigue siendo un problema (y no es compatible con jQuery 2). Pero la cuenta regresiva para IE8 está en curso theie8countdown.com
Toskan
1
@nfechner. ¿Qué es más legible en tu opinión? $("#annoying\\:colon")o $(document.getElementById("annoying:colon"))?
Jakub Godoniuk
29

Obviamente, se está tropezando con los dos puntos, porque jQuery está tratando de interpretarlo como un selector. Intenta usar el selector de atributos id.

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

Simplemente usaría document.getElementByIdy pasaría el resultado a la jQuery()función.

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

usa dos barras invertidas \\

MANIFESTACIÓN

como está escrito aquí

Si desea utilizar cualquiera de los metacaracteres (como! "# $% & '() * +,. / :; <=>? @ [] ^` {|} ~) Como parte literal de un nombre, debe escapar del carácter con dos barras invertidas: \. Por ejemplo, si tiene un elemento con id = "foo.bar", puede usar el selector $ ("# foo \ .bar"). La especificación CSS del W3C contiene el completo

Referencia

diEcho
fuente
4

Refiriéndome a la respuesta de Toskan, actualicé su código para hacerlo más legible y luego lo envié a la página.

Aquí está el enlace de jbin: http://jsbin.com/ujajuf/14/edit .



Además, lo ejecuté con más iteraciones

Iterations:1000000

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

Aún más:

Iterations:10000000

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

intenta usar $('#test\\:abc')

Mithun Sreedharan
fuente
1

Esta sintaxis $('[id="test:abc"]') funcionó para mí. Estoy usando Netbeans 6.5.1& genera componentes con un idque contiene a : (colon). Probé el \\& the \3Apero ninguno de ellos funcionó.

JVR
fuente
0

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

zindel
fuente