Solo debe haber un elemento con una identificación dada. Si estás atascado con esa situación, mira la segunda mitad de mi respuesta para ver las opciones.
El comportamiento de un navegador cuando tiene múltiples elementos con el mismo ID (HTML ilegal) no está definido por especificación. Puede probar todos los navegadores y descubrir cómo se comportan, pero no es prudente utilizar esta configuración o depender de un comportamiento en particular.
Utilice las clases si quiere que varios objetos tengan el mismo identificador.
<div>
<span class="a">1</span>
<span class="a">2</span>
<span>3</span>
</div>
$(function() {
var w = $("div");
console.log($(".a").length); // 2
console.log($("body .a").length); // 2
console.log($(".a", w).length); // 2
});
Si desea buscar de forma fiable a elementos con identificadores que son los mismos porque no se puede solucionar el documento, entonces usted tendrá que hacer su propia iteración ya que no se puede confiar en cualquiera de la construcción en DOM funciones.
Se podía hacerlo de esta manera:
function findMultiID(id) {
var results = [];
var children = $("div").get(0).children;
for (var i = 0; i < children.length; i++) {
if (children[i].id == id) {
results.push(children[i]);
}
}
return(results);
}
O, usando jQuery: ejemplo de trabajo
$("div *").filter(function() {return(this.id == "a");});
jQuery: http://jsfiddle.net/jfriend00/XY2tX/.
En cuanto a Por qué obtiene resultados diferentes, eso tendría que ver con la implementación interna de cualquier parte del código que estaba llevando a cabo la operación del selector real. En jQuery, podrías estudiar el código para descubrir qué hacía cada versión determinada, pero como se trata de HTML ilegal, no hay garantía de que se mantenga igual a lo largo del tiempo. Por lo que he visto en jQuery, primero comprueba si el selector es una identificación simple como #a
y, si es así, acaba de usar document.getElementById("a")
. Si el selector es más complejo que eso y existe querySelectorAll()
, jQuery a menudo pasará el selector a la función incorporada del navegador que tendrá una implementación específica para ese navegador. Si querySelectorAll()
no existe, usará el motor de selección Sizzle para encontrar manualmente el selector que tendrá su propia implementación. Por lo tanto, puede tener al menos tres implementaciones diferentes, todas en la misma familia de exploradores, dependiendo del selector exacto y de qué tan nuevo sea el navegador. Entonces, los navegadores individuales tendrán sus propias implementaciones querySelectorAll()
. Si desea afrontar de manera confiable esta situación, probablemente tendrá que usar su propio código de iteración como lo he ilustrado anteriormente.
Podría explicar el ** Nota **? ¿Cuándo es útil agregar el selector de etiquetas? –
@Misha Moroshko: siempre que sea posible, debe incluir un selector de etiquetas. La razón de esto es porque un selector de etiquetas es * mucho * más eficiente que un selector de atributos. Si califica su selector de atributos con un selector de etiquetas, jQuery primero usará el selector de etiquetas para encontrar los elementos con esa etiqueta, y luego solo ejecutará el selector de atributos en esos elementos. Esto es simplemente mucho más eficiente. –
Veo que 'div # some_id' es más lento que' # some_id': http://stackoverflow.com/q/7262116/247243 –