Me gustaría saber cuál es exactamente la diferencia entre querySelector
y querySelectorAll
contra getElementsByClassName
y getElementById
.
Desde este enlace , podría reunir eso con lo querySelector
que puedo escribir document.querySelector(".myclass")
para obtener elementos con clase myclass
y document.querySelector("#myid")
para obtener elementos con ID myid
. Pero ya puedo hacer eso getElementsByClassName
y getElementById
. ¿Cuál debería ser el preferido?
También trabajo en XPages donde la ID se genera dinámicamente con dos puntos y tiene este aspecto view:_id1:inputText1
. Entonces cuando escribo document.querySelector("#view:_id1:inputText1")
no funciona. Pero la escritura document.getElementById("view:_id1:inputText1")
funciona. Alguna idea de por qué?
fuente
document.querySelectorAll(".myclass")
? El usodocument.querySelector(".myclass")
solo devolverá el primer elemento que coincida.Respuestas:
La sintaxis y el soporte del navegador.
querySelector
es más útil cuando desea usar selectores más complejos.Por ejemplo, todos los elementos de la lista descienden de un elemento que es miembro de la clase foo:
.foo li
El
:
personaje tiene un significado especial dentro de un selector. Tienes que escapar de eso. (El carácter de escape del selector también tiene un significado especial en una cadena JS, por lo que también debe escapar de eso ).fuente
getElementById
ygetElementsByClassName
. La selección de className puede ser unos cientos de veces más lenta singetElementsByClassName
.Recopilación de documentación de Mozilla:
La interfaz NodeSelector Esta especificación agrega dos métodos nuevos a cualquier objeto que implemente las interfaces Document, DocumentFragment o Element:
querySelector
querySelectorAll
y
fuente
Sobre las diferencias, hay uno importante en los resultados entre
querySelectorAll
ygetElementsByClassName
: el valor de retorno es diferente.querySelectorAll
devolverá una colección estática, mientras quegetElementsByClassName
devuelve una colección en vivo. Esto podría generar confusión si almacena los resultados en una variable para su uso posterior:querySelectorAll
contendrá los elementos que cumplieron con el selector en el momento en que se llamó al método .getElementsByClassName
contendrá los elementos que cumplieron con el selector cuando se usa (que puede ser diferente del momento en que se llamó al método).Por ejemplo, observe cómo, incluso si no ha reasignado las variables
aux1
yaux2
, contienen valores diferentes después de actualizar las clases:fuente
document.getElementsByName
,document.getElementsByTagNameNS
odocument.getElementsByTagName
exhibirán el mismo comportamiento.document.getElementById()
no devuelve un nodo activo . Es más rápido quedocument.querySelector('#id_here')
probablemente porquequerySelector
primero tendrá que analizar el selector CSS.Por esta respuesta, me refiero a
querySelector
, yquerySelectorAll
como querySelector * y paragetElementById
,getElementsByClassName
,getElementsByTagName
, ygetElementsByName
como getElement *.Principales diferencias
querySelector
ygetElementById
ambos devuelven un solo elemento.querySelectorAll
ygetElementsByName
ambos devuelven NodeLists, que son funciones más nuevas que se agregaron después de que HTMLCollection pasara de moda. Los más antiguosgetElementsByClassName
y losgetElementsByTagName
dos devuelven colecciones HTMLC. Nuevamente, esto es esencialmente irrelevante para saber si los elementos son vivos o estáticos.Estos conceptos se resumen en la siguiente tabla.
Detalles, consejos y ejemplos
Las colecciones HTMLC no son tan similares a una matriz como NodeLists y no admiten .forEach (). Creo que el operador de propagación es útil para solucionar esto:
[...document.getElementsByClassName("someClass")].forEach()
Cada elemento, y el global
document
, tienen acceso a todas estas funciones, excepto paragetElementById
ygetElementsByName
, que solo se implementan endocument
.El encadenamiento de llamadas getElement * en lugar de usar querySelector * mejorará el rendimiento, especialmente en DOM muy grandes. Incluso en DOM pequeños y / o con cadenas muy largas, generalmente es más rápido. Sin embargo, a menos que sepa que necesita el rendimiento, se debe preferir la legibilidad de querySelector *.
querySelectorAll
a menudo es más difícil de reescribir, porque debe seleccionar elementos de NodeList o HTMLCollection en cada paso. Por ejemplo, el siguiente código no funciona:document.getElementsByClassName("someClass").getElementsByTagName("div")
document.getElementById("someId").getElementsByClassName("someClass")[0].getElementsByTagName("div")[0]
Dado que todos los elementos tienen acceso a las consultas querySelector * y getElement *, puede hacer cadenas utilizando ambas llamadas, lo que puede ser útil si desea un aumento de rendimiento, pero no puede evitar un querySelector que no se puede escribir en términos de las llamadas getElement * .
Aunque generalmente es fácil saber si un selector se puede escribir usando solo llamadas getElement *, hay un caso que puede no ser obvio:
document.querySelectorAll(".class1.class2")
puede reescribirse como
document.getElementsByClassName("class1 class2")
El uso de getElement * en un elemento estático obtenido con querySelector * dará como resultado un elemento que está activo con respecto al subconjunto estático del DOM copiado por querySelector, pero no con respecto al documento completo DOM ... aquí es donde lo simple La interpretación en vivo / estática de los elementos comienza a desmoronarse. Probablemente debería evitar situaciones en las que deba preocuparse por esto, pero si lo hace, recuerde que querySelector * llama a los elementos de copia que encuentran antes de devolverles referencias, pero getElement * llama a buscar referencias directas sin copiar.
Ninguna API especifica qué elemento debe seleccionarse primero si hay varias coincidencias.
Debido a que querySelector * itera a través del DOM hasta que encuentra una coincidencia (ver Diferencia principal # 2), lo anterior también implica que no puede confiar en la posición de un elemento que está buscando en el DOM para garantizar que se encuentre rápidamente: el el navegador puede iterar a través del DOM hacia atrás, hacia adelante, primero en profundidad, primero en ancho o de otra manera. getElement * seguirá encontrando elementos en aproximadamente la misma cantidad de tiempo, independientemente de su ubicación.
fuente
Vine a esta página simplemente para encontrar el mejor método para usar en términos de rendimiento, es decir, cuál es más rápido:
y encontré esto: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18
Ejecuta una prueba en los 2 x ejemplos anteriores, además de lanzar una prueba para el selector equivalente de jQuery también. Los resultados de mi prueba fueron los siguientes:
fuente
querySelectorAll
necesita trabajo adicional detrás de escena (incluido el análisis de la expresión del selector, la explicación de pseudo elementos, etc.), mientras quegetElementsByClassName
es simplemente un recorrido recursivo de objetos.querySelector
puede ser un completo CSS (3) -Selector con ID y clases y pseudo-clases juntas de esta manera:con
getElementByClassName
usted solo puede definir una clasecon
getElementById
usted solo puede definir una identificaciónfuente
:first
un selector CSS, ahora?:first-class
o:first-of-type
tal vez, pero pensé que:first
era una adición de JavaScript / jQuery / Sizzle:first
es, notablemente, no:first-child
.querySelector
yquerySelectorAll
son API relativamente nuevas, mientras quegetElementById
ygetElementsByClassName
han estado con nosotros por mucho más tiempo. Eso significa que lo que use dependerá principalmente de los navegadores que necesite admitir.En cuanto al
:
, tiene un significado especial, por lo que debe escapar si tiene que usarlo como parte de un ID / nombre de clase.fuente
querySelectorAll
está disponible en IE8, mientrasgetElementsByClassName
que no lo está.querySelectorAll
... básicamente todo: caniuse.com/#search=querySelectorAllquerySelector
es de w3c Selector APIgetElementBy
es de w3c DOM APIEn mi opinión, la diferencia más notable es que el tipo de retorno de
querySelectorAll
es una lista de nodos estáticos ygetElementsBy
es una lista de nodos en vivo. Por lo tanto, el bucle en la demostración 2 nunca termina porquelis
es en vivo y se actualiza durante cada iteración.fuente
Diferencia entre "querySelector" y "querySelectorAll"
fuente
mira este
getElementById más rápido que querySelector en un 25%
jquery es el más lento
fuente
La principal diferencia entre querySelector y getlementbyID (Claassname, Tagname, etc.) es si hay más de un elemento que satisface la condición querySelector devolverá solo una salida, mientras que getElementBy * devolverá todos los elementos.
Consideremos un ejemplo para hacerlo más claro.
El siguiente código explicará la diferencia
Indique si queremos seleccionar un solo elemento para ir a queryslector o si queremos que varios elementos vayan a getElement
fuente