Chciałbym wiedzieć, jaka dokładnie jest różnica między querySelector
i querySelectorAll
przeciw getElementsByClassName
i getElementById
?
Z tego linku mogłem zebrać, że za pomocą querySelector
mogę pisać, document.querySelector(".myclass")
aby uzyskać elementy z klasą myclass
i document.querySelector("#myid")
uzyskać element z ID myid
. Ale już mogę to zrobić getElementsByClassName
i getElementById
. Który powinien być preferowany?
Pracuję również w XPages, gdzie identyfikator jest dynamicznie generowany za pomocą dwukropka i wygląda tak view:_id1:inputText1
. Więc kiedy piszę, document.querySelector("#view:_id1:inputText1")
to nie działa. Ale pisanie document.getElementById("view:_id1:inputText1")
działa. Jakieś pomysły, dlaczego?
javascript
Naveen
źródło
źródło
document.querySelectorAll(".myclass")
? Użyciedocument.querySelector(".myclass")
zwróci tylko pierwszy pasujący element.Odpowiedzi:
Składnia i obsługa przeglądarki.
querySelector
jest bardziej przydatne, gdy chcesz używać bardziej złożonych selektorów.Np. wszystkie pozycje listy wywodzące się z elementu będącego członkiem klasy foo:
.foo li
:
Znak ma specjalne znaczenie wewnątrz selektora. Musisz od tego uciec. (Znak selektor ucieczka ma szczególne znaczenie w ciąg JS też, więc trzeba się uciekać , że zbyt).źródło
getElementById
igetElementsByClassName
. Wybór className może być kilkaset razy wolniejszy bezgetElementsByClassName
.pobieranie z Dokumentacji Mozilli:
Interfejs NodeSelector Ta specyfikacja dodaje dwie nowe metody do dowolnych obiektów implementujących interfejsy Document, DocumentFragment lub Element:
querySelector
querySelectorAll
i
źródło
Jeśli chodzi o różnice, jest jeden ważny w wynikach między
querySelectorAll
agetElementsByClassName
: wartość zwracana jest inna.querySelectorAll
zwróci kolekcję statyczną, podczas gdygetElementsByClassName
zwróci kolekcję na żywo. Może to prowadzić do nieporozumień, jeśli przechowujesz wyniki w zmiennej do późniejszego wykorzystania:querySelectorAll
będzie zawierała elementy, które wypełniły selektor w momencie wywołania metody .getElementsByClassName
będzie zawierała elementy, które wypełniły selektor, gdy jest używana (mogą różnić się od momentu wywołania metody).Na przykład zwróć uwagę, że nawet jeśli nie zmienisz przypisania zmiennych
aux1
iaux2
, po zaktualizowaniu klas zawierają one inne wartości:źródło
document.getElementsByName
,document.getElementsByTagNameNS
czydocument.getElementsByTagName
będzie wykazywać takie samo zachowanie.document.getElementById()
nie zwraca aktywnego węzła. Jest to szybsze niżdocument.querySelector('#id_here')
prawdopodobnie, ponieważquerySelector
najpierw trzeba będzie przeanalizować selektor CSS.Dla tej odpowiedzi, odsyłam do
querySelector
iquerySelectorAll
jak querySelector * igetElementById
,getElementsByClassName
,getElementsByTagName
, igetElementsByName
jak getElement *.Główne różnice
querySelector
igetElementById
oba zwracają pojedynczy element.querySelectorAll
igetElementsByName
oba zwracają NodeLists, będąc nowszymi funkcjami, które zostały dodane po tym, jak HTMLCollection wyszedł z mody. StarszegetElementsByClassName
igetElementsByTagName
oba zwracają HTMLCollections. Ponownie, nie ma to zasadniczo znaczenia dla tego, czy elementy są na żywo, czy statyczne.Pojęcia te podsumowano w poniższej tabeli.
Szczegóły, wskazówki i przykłady
HTMLCollections nie są tak podobne do tablic jak NodeLists i nie obsługują .forEach (). Uważam, że operator rozprzestrzeniania jest przydatny do obejścia tego:
[...document.getElementsByClassName("someClass")].forEach()
Każdy element, także globalny
document
, ma dostęp do wszystkich tych funkcji z wyjątkiemgetElementById
igetElementsByName
, które są zaimplementowane tylko wdocument
.Łączenie wywołań getElement * w łańcuch zamiast używania querySelector * poprawi wydajność, szczególnie w przypadku bardzo dużych DOM. Nawet na małych DOMach i / lub przy bardzo długich łańcuchach jest generalnie szybszy. Jeśli jednak nie wiesz, że potrzebujesz wydajności, preferowana powinna być czytelność querySelector *.
querySelectorAll
jest często trudniejsze do przepisania, ponieważ na każdym kroku musisz wybierać elementy z NodeList lub HTMLCollection. Na przykład poniższy kod nie działa:document.getElementsByClassName("someClass").getElementsByTagName("div")
document.getElementById("someId").getElementsByClassName("someClass")[0].getElementsByTagName("div")[0]
Ponieważ wszystkie elementy mają dostęp zarówno do wywołań querySelector *, jak i getElement *, możesz tworzyć łańcuchy przy użyciu obu wywołań, co może być przydatne, jeśli chcesz uzyskać pewien wzrost wydajności, ale nie można uniknąć zapytania querySelector, którego nie można zapisać w kategoriach wywołań getElement * .
Chociaż na ogół łatwo jest stwierdzić, czy selektor można zapisać za pomocą tylko wywołań getElement *, jest jeden przypadek, który może nie być oczywisty:
document.querySelectorAll(".class1.class2")
można przepisać jako
document.getElementsByClassName("class1 class2")
Użycie getElement * na elemencie statycznym pobranym za pomocą querySelector * spowoduje, że element będzie aktywny w odniesieniu do statycznego podzbioru DOM skopiowanego przez querySelector, ale nie będzie żył w odniesieniu do całego DOM dokumentu ... żywa / statyczna interpretacja elementów zaczyna się rozpadać. Powinieneś prawdopodobnie unikać sytuacji, w których musisz się o to martwić, ale jeśli to zrobisz, pamiętaj, że querySelector * wywołuje kopiowanie elementów, które znajdą przed zwróceniem do nich odniesień, ale wywołania getElement * pobierają bezpośrednie odniesienia bez kopiowania.
Żaden interfejs API nie określa, który element powinien zostać wybrany jako pierwszy, jeśli istnieje wiele dopasowań.
Ponieważ querySelector * iteruje przez DOM, aż znajdzie dopasowanie (patrz Główna różnica # 2), powyższe oznacza również, że nie można polegać na pozycji elementu, którego szukasz w DOM, aby zagwarantować, że zostanie on szybko znaleziony - przeglądarka może iterować przez DOM wstecz, do przodu, najpierw głębia, najpierw wszerz lub w inny sposób. getElement * nadal znajdzie elementy w mniej więcej tym samym czasie, niezależnie od ich rozmieszczenia.
źródło
Przyszedłem na tę stronę wyłącznie po to, aby dowiedzieć się, jaka metoda jest lepsza do zastosowania pod względem wydajności - tj. Która jest szybsza:
i znalazłem to: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18
Uruchamia test na przykładach 2 x powyżej, a ponadto wsuwa test dla równoważnego selektora jQuery. moje wyniki testów były następujące:
źródło
querySelectorAll
wymaga dodatkowej pracy za kulisami (w tym analizowania wyrażenia selektora, uwzględniania pseudoelementów itp.), Podczas gdygetElementsByClassName
jest to tylko rekurencyjne przechodzenie przez obiekt.querySelector
może być kompletnym selektorem CSS (3) z identyfikatorami, klasami i pseudoklasami razem w następujący sposób:z
getElementByClassName
tobą możesz po prostu zdefiniować klasęze
getElementById
można po prostu określić identyfikatorźródło
:first
teraz jest selektor CSS?:first-class
, a:first-of-type
może, ale myślałem, że:first
to dodatek JavaScript / jQuery / Sizzle.:first
jest, zauważalnie, nie:first-child
.querySelector
iquerySelectorAll
są stosunkowo nowe API, natomiastgetElementById
igetElementsByClassName
są z nami na dużo dłużej. Oznacza to, że to, czego używasz, będzie zależeć głównie od przeglądarek, które chcesz obsługiwać.Jeśli chodzi o
:
, ma on specjalne znaczenie, więc musisz go uciec, jeśli musisz go użyć jako części identyfikatora / nazwy klasy.źródło
querySelectorAll
jest dostępny w IE8, agetElementsByClassName
nie.querySelectorAll
... w zasadzie wszystko: caniuse.com/#search=querySelectorAllquerySelector
jest w3c Selector APIgetElementBy
jest w3c DOM APIIMO najbardziej zauważalną różnicą jest to, że zwracanym typem
querySelectorAll
jest statyczna lista węzłów, aw przypadkugetElementsBy
węzłów aktywna lista. Dlatego pętla w wersji demonstracyjnej 2 nigdy się nie kończy, ponieważlis
jest na żywo i aktualizuje się podczas każdej iteracji.źródło
Różnica między „querySelector” i „querySelectorAll”
źródło
Spójrz na to
getElementById szybciej niż querySelector na 25%
jquery jest najwolniejsze
źródło
Główna różnica między querySelector i getlementbyID (Claassname, Tagname itp.) Polega na tym, że istnieje więcej niż jeden element spełniający warunek. QuerySelector zwróci tylko jedno wyjście, podczas gdy getElementBy * zwróci wszystkie elementy.
Rozważmy przykład, aby było jaśniej.
Poniższy kod wyjaśni różnicę
W skrócie, jeśli chcemy wybrać pojedynczy element, przejdź do queryslector lub jeśli chcemy, aby wiele elementów przeszło do getElement
źródło