Я хотел бы знать, в чем именно разница между querySelector
и querySelectorAll
против getElementsByClassName
и getElementById
?
По этой ссылке я querySelector
могу узнать, что с помощью я могу написать, document.querySelector(".myclass")
чтобы получить элементы с классом myclass
и document.querySelector("#myid")
получить элемент с идентификатором myid
. Но я уже могу это сделать getElementsByClassName
и getElementById
. Какой из них должен быть предпочтительным?
Также я работаю в XPages, где идентификатор динамически генерируется с двоеточием и выглядит следующим образом view:_id1:inputText1
. Поэтому, когда я пишу, document.querySelector("#view:_id1:inputText1")
это не работает. Но написание document.getElementById("view:_id1:inputText1")
работает. Есть идеи почему?
источник
document.querySelectorAll(".myclass")
? Использованиеdocument.querySelector(".myclass")
вернет только первый соответствующий элемент.Ответы:
Синтаксис и поддержка браузера.
querySelector
более полезно, когда вы хотите использовать более сложные селекторы.Например, все элементы списка произошли от элемента, который является членом класса foo:
.foo li
Символ
:
имеет особое значение внутри селектора. Вы должны избежать этого. (Символ побега селектора имеет особое значение в строке JS, так что вы должны бежать , что тоже).источник
getElementById
иgetElementsByClassName
. Без выбора className может быть несколько сотен раз медленнееgetElementsByClassName
.Сбор от Mozilla Документация:
Интерфейс NodeSelector Эта спецификация добавляет два новых метода к любым объектам, реализующим интерфейсы Document, DocumentFragment или Element:
querySelector
querySelectorAll
и
источник
Что касается различий, в результатах между
querySelectorAll
и есть важный аспектgetElementsByClassName
: возвращаемое значение отличается.querySelectorAll
вернет статическую коллекцию, аgetElementsByClassName
вернет живую коллекцию. Это может привести к путанице, если вы сохраните результаты в переменной для дальнейшего использования:querySelectorAll
будет содержать элементы, которые выполнили селектор в момент вызова метода .getElementsByClassName
будет содержать элементы, которые выполнили селектор, когда он используется (который может отличаться от момента вызова метода).Например, обратите внимание, что даже если вы не переназначили переменные
aux1
иaux2
они содержат разные значения после обновления классов:источник
document.getElementsByName
,document.getElementsByTagNameNS
илиdocument.getElementsByTagName
будут демонстрировать такое же поведение.document.getElementById()
не возвращает живой узел. Это быстрее, чем,document.querySelector('#id_here')
вероятно, потому чтоquerySelector
сначала нужно будет проанализировать селектор CSS.Для этого ответа, я имею в виду
querySelector
и ,querySelectorAll
как querySelector * иgetElementById
,getElementsByClassName
,getElementsByTagName
, и ,getElementsByName
как getElement *.Основные отличия
querySelector
иgetElementById
оба возвращают один элемент.querySelectorAll
иgetElementsByName
оба возвращают NodeLists, будучи более новыми функциями, которые были добавлены после того, как HTMLCollection вышел из моды. СтарыеgetElementsByClassName
иgetElementsByTagName
оба возвращают HTMLCollections. Опять же, это по существу не имеет отношения к тому, являются ли элементы живыми или статичными.Эти понятия обобщены в следующей таблице.
Подробности, советы и примеры
HTMLCollections не так массивен, как NodeLists, и не поддерживает .forEach (). Я считаю, что оператор распространения полезен, чтобы обойти это:
[...document.getElementsByClassName("someClass")].forEach()
Каждый элемент, и глобальный
document
, имеют доступ ко всем этим функциям, кромеgetElementById
иgetElementsByName
, которые реализованы только вdocument
.Цепочка вызовов getElement * вместо использования querySelector * улучшит производительность, особенно на очень больших DOM. Даже на небольших DOM и / или с очень длинными цепями это обычно быстрее. Однако, если вы не знаете, что вам нужна производительность, читаемость querySelector * должна быть предпочтительной.
querySelectorAll
часто труднее переписать, потому что вы должны выбирать элементы из NodeList или HTMLCollection на каждом шаге. Например, следующий код не работает:document.getElementsByClassName("someClass").getElementsByTagName("div")
document.getElementById("someId").getElementsByClassName("someClass")[0].getElementsByTagName("div")[0]
Поскольку все элементы имеют доступ как к вызовам querySelector *, так и к getElement *, вы можете создавать цепочки, используя оба вызова, что может быть полезно, если вы хотите повысить производительность, но не можете избежать запроса querySelector, который нельзя записать в терминах вызовов getElement *. ,
Хотя, как правило, легко определить, можно ли писать селектор, используя только вызовы getElement *, есть один случай, который может быть неочевидным:
document.querySelectorAll(".class1.class2")
можно переписать как
document.getElementsByClassName("class1 class2")
Использование getElement * для статического элемента, извлеченного с помощью querySelector *, приведет к тому, что элемент будет действителен по отношению к статическому подмножеству DOM, скопированному с помощью querySelector, но не будет действителен по отношению к полному DOM документа ... вот где простое Живая / статическая интерпретация элементов начинает разваливаться. Вам, вероятно, следует избегать ситуаций, когда вам нужно беспокоиться об этом, но если вы это сделаете, помните, что querySelector * вызывает элементы копирования, которые они находят, прежде чем возвращать ссылки на них, но getElement * вызывает выборку прямых ссылок без копирования.
Ни один API не указывает, какой элемент должен быть выбран первым, если есть несколько совпадений.
Поскольку querySelector * выполняет итерацию по DOM до тех пор, пока не найдет совпадение (см. Основное отличие № 2), вышеприведенное также подразумевает, что вы не можете полагаться на положение элемента, который вы ищете в DOM, чтобы гарантировать его быстрое нахождение - Браузер может перебирать DOM назад, вперед, сначала в глубину, в ширину или другим способом. getElement * все равно будет находить элементы примерно в одинаковое время независимо от их размещения.
источник
Я пришел на эту страницу исключительно для того, чтобы выяснить, какой метод лучше использовать с точки зрения производительности, т. Е. Какой из них быстрее:
и я нашел это: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18
Он запускает тест на 2х приведенных выше примерах, а также тест на эквивалентный селектор jQuery. мои результаты испытаний были следующими:
источник
querySelectorAll
требуется дополнительная работа за кулисами (в том числе анализ выражения селектора, учет псевдоэлементов и т. Д.), ХотяgetElementsByClassName
это всего лишь рекурсивный обход объекта.querySelector
может быть полным CSS (3) -выборщиком с идентификаторами, классами и псевдоклассами вместе, например так:с помощью которого
getElementByClassName
вы можете просто определить классс помощью которого
getElementById
вы можете просто определить идентификатористочник
:first
селектор CSS, теперь?:first-class
или,:first-of-type
может быть, но я подумал, что:first
это дополнение JavaScript / jQuery / Sizzle.:first
, заметно, нет:first-child
.querySelector
иquerySelectorAll
являются относительно новыми API, тогда какgetElementById
иgetElementsByClassName
были с нами намного дольше. Это означает, что то, что вы используете, будет в основном зависеть от того, какие браузеры вам нужно поддерживать.Что касается
:
, он имеет особое значение, поэтому вы должны избегать его, если вы должны использовать его как часть идентификатора / имени класса.источник
querySelectorAll
доступно в IE8, аgetElementsByClassName
нет.querySelectorAll
... в основном все: caniuse.com/#search=querySelectorAllquerySelector
имеет w3c Selector APIgetElementBy
имеет w3c DOM APIИМО самая заметная разница в том, что тип возвращаемого значения
querySelectorAll
представляет собой статический список узлов, а дляgetElementsBy
него - список активных узлов. Поэтому цикл в демо 2 никогда не заканчивается, потому чтоlis
он активен и обновляется во время каждой итерации.источник
Разница между "querySelector" и "querySelectorAll"
источник
посмотри на это
getElementById быстрее, чем querySelector на 25%
JQuery является самым медленным
источник
Основное различие между querySelector и getlementbyID (Claassname, Tagname и т. Д.) Состоит в том, что если существует более одного элемента, удовлетворяющего условию, то querySelector вернет только один выход, тогда как getElementBy * вернет все элементы.
Давайте рассмотрим пример, чтобы сделать его более понятным.
Ниже код объяснит разницу
Inshort, если мы хотим выбрать один элемент, перейти к Queryslector или если мы хотим, чтобы несколько элементов перейти к getElement
источник