Me gustaría saber cuál es exactamente la diferencia entre querySelectory querySelectorAllcontra getElementsByClassNamey getElementById.
Desde este enlace , podría reunir eso con lo querySelectorque puedo escribir document.querySelector(".myclass")para obtener elementos con clase myclassy document.querySelector("#myid")para obtener elementos con ID myid. Pero ya puedo hacer eso getElementsByClassNamey 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.
querySelectores 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 liEl
: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
getElementByIdygetElementsByClassName. 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
querySelectorAllygetElementsByClassName: el valor de retorno es diferente.querySelectorAlldevolverá una colección estática, mientras quegetElementsByClassNamedevuelve una colección en vivo. Esto podría generar confusión si almacena los resultados en una variable para su uso posterior:querySelectorAllcontendrá los elementos que cumplieron con el selector en el momento en que se llamó al método .getElementsByClassNamecontendrá 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
aux1yaux2, contienen valores diferentes después de actualizar las clases:fuente
document.getElementsByName,document.getElementsByTagNameNSodocument.getElementsByTagNameexhibirán el mismo comportamiento.document.getElementById()no devuelve un nodo activo . Es más rápido quedocument.querySelector('#id_here')probablemente porquequerySelectorprimero tendrá que analizar el selector CSS.Por esta respuesta, me refiero a
querySelector, yquerySelectorAllcomo querySelector * y paragetElementById,getElementsByClassName,getElementsByTagName, ygetElementsByNamecomo getElement *.Principales diferencias
querySelectorygetElementByIdambos devuelven un solo elemento.querySelectorAllygetElementsByNameambos devuelven NodeLists, que son funciones más nuevas que se agregaron después de que HTMLCollection pasara de moda. Los más antiguosgetElementsByClassNamey losgetElementsByTagNamedos 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 paragetElementByIdygetElementsByName, 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 *.
querySelectorAlla 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
querySelectorAllnecesita trabajo adicional detrás de escena (incluido el análisis de la expresión del selector, la explicación de pseudo elementos, etc.), mientras quegetElementsByClassNamees simplemente un recorrido recursivo de objetos.querySelectorpuede ser un completo CSS (3) -Selector con ID y clases y pseudo-clases juntas de esta manera:con
getElementByClassNameusted solo puede definir una clasecon
getElementByIdusted solo puede definir una identificaciónfuente
:firstun selector CSS, ahora?:first-classo:first-of-typetal vez, pero pensé que:firstera una adición de JavaScript / jQuery / Sizzle:firstes, notablemente, no:first-child.querySelectoryquerySelectorAllson API relativamente nuevas, mientras quegetElementByIdygetElementsByClassNamehan 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
querySelectorAllestá disponible en IE8, mientrasgetElementsByClassNameque no lo está.querySelectorAll... básicamente todo: caniuse.com/#search=querySelectorAllquerySelectores de w3c Selector APIgetElementByes de w3c DOM APIEn mi opinión, la diferencia más notable es que el tipo de retorno de
querySelectorAlles una lista de nodos estáticos ygetElementsByes una lista de nodos en vivo. Por lo tanto, el bucle en la demostración 2 nunca termina porquelises 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