querySelector и querySelectorAll vs getElementsByClassName и getElementById в JavaScript
я хотел бы знать, в чем именно заключается разница между querySelector и querySelectorAll против getElementsByClassName и getElementById?
С этой ссылке я мог бы собрать это с querySelector Я могу написать document.querySelector(".myclass") чтобы получить элементы с классом myclass и document.querySelector("#myid") чтобы получить элемент с ID myid. Но я уже могу это сделать getElementsByClassName и getElementById. Какой из них следует предпочесть?
также я работаю в XPages, где идентификатор динамически генерируется с двоеточием и выглядит вот так view:_id1:inputText1. Так что когда я пишу document.querySelector("#view:_id1:inputText1") он не работает. Но писать document.getElementById("view:_id1:inputText1") строительство. Есть идеи почему?
6 ответов:
Я хотел бы знать, в чем именно заключается разница между querySelector и querySelectorAll против getElementsByClassName и getElementById?
синтаксис и поддержка браузера.
querySelectorэто более полезно, когда вы хотите использовать более сложные селекторы.например, все элементы списка, происходящие от элемента, который является членом класса foo:
.foo liдокумент.querySelector ("#view: _id1:inputText1") это не работает. Но пишу документ.getElementById ("view:_id1:inputText1") работает. Есть идеи почему?
The
:символ имеет особое значение внутри селектора. Вы должны избежать этого. (Escape-символ селектора также имеет особое значение в строке JS, поэтому вам нужно бежать это тоже).document.querySelector("#view\:_id1\:inputText1")
взыскании с Документация Mozilla:
интерфейс NodeSelector Эта спецификация добавляет два новых метода к любым объектам, реализующим интерфейс Document, DocumentFragment или Element:
querySelector
возвращает первый соответствующий узел элемента в поддереве узла. Если соответствующий узел найден, null возвращенный.
querySelectorAll
возвращает a список узлов, содержащий все соответствующие элементы узлы в поддерево узла или пустой список узлов, если совпадения не найдены.
и
Примечание: NodeList возвращается
querySelectorAll()не проживают, что означает, что изменения в DOM не отражаются в коллекции. Это отличается от других методов запроса DOM, которые возвращение в прямом эфире список узлов.
о различиях, есть важный в результатах между
querySelectorAllиgetElementsByClassName: возвращаемое значение отличается.querySelectorAllвернет статическую коллекцию, в то время какgetElementsByClassNameвозвращает живую коллекцию. Это может привести к путанице, если вы сохраните результаты в переменной для дальнейшего использования:
- переменная, сгенерированная с помощью
querySelectorAllбудет содержать элементы, которые выполнены селектор на данный момент метод был назван.- A переменная генерируется с помощью
getElementsByClassNameбудет содержать элементы, которые выполнены селектор если используется (это может отличаться от момента вызова метода).например, обратите внимание, как даже если вы не переназначить переменные
aux1иaux2, они содержат разные значения после обновления классов:// storing all the elements with class "blue" using the two methods var aux1 = document.querySelectorAll(".blue"); var aux2 = document.getElementsByClassName("blue"); // write the number of elements in each array (values match) console.log("Number of elements with querySelectorAll = " + aux1.length); console.log("Number of elements with getElementsByClassName = " + aux2.length); // change one element's class to "blue" document.getElementById("div1").className = "blue"; // write the number of elements in each array (values differ) console.log("Number of elements with querySelectorAll = " + aux1.length); console.log("Number of elements with getElementsByClassName = " + aux2.length);.red { color:red; } .green { color:green; } .blue { color:blue; }<div id="div0" class="blue">Blue</div> <div id="div1" class="red">Red</div> <div id="div2" class="green">Green</div>
querySelectorможет быть полный CSS (3)-селектор с идентификаторами и классами и Псевдоклассами вместе, как это:'#id.class:pseudo' // or 'tag #id .class .class.class'С
getElementByClassNameвы можете просто определить класс'class'С
getElementByIdвы можете просто определить идентификатор'id'
Я пришел на эту страницу исключительно для того, чтобы узнать лучший метод для использования с точки зрения производительности - т. е. который быстрее:
querySelector / querySelectorAll or getElementsByClassNameи я нашел это: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18
он запускает тест на 2 x примерах выше, плюс он также запускает тест для эквивалентного селектора jQuery. мои результаты теста были следующими:
getElementsByClassName = 1,138,018 operations / sec - <<< clear winner querySelectorAll = 39,033 operations / sec jquery select = 381,648 operations / sec
querySelectorиquerySelectorAllявляются относительно новыми API, тогда какgetElementByIdиgetElementsByClassNameбыли с нами намного дольше. Это означает, что вы используете, будет в основном зависеть от того, какие браузеры нужно поддерживать.Что касается
:, это имеет особое значение, так что вы должны избежать его, если вы должны использовать его как часть имени ID/класса.
Comments