Javascript querySelector so với getElementById [đã đóng]


122

Tôi đã nghe nói rằng querySelector& querySelectorAlllà các phương pháp mới để chọn DOMphần tử. Làm thế nào để họ so sánh với các phương pháp cũ hơn getElementByIdgetElementsByClassNamevề hiệu suất và hỗ trợ trình duyệt?

Hiệu suất so với việc sử dụng bộ chọn truy vấn của jQuery như thế nào?

Có đề xuất phương pháp hay nhất nào để sử dụng tập hợp gốc không?


1
Xác định tốt hơn. Chúng gần như hoàn toàn khác nhau.

4
Điều này giống như việc hỏi "cờ lê một kích thước có tốt hơn cờ lê điều chỉnh không?" Câu trả lời là: chúng mạnh hơn và linh hoạt hơn, và do đó trong nhiều trường hợp vượt trội hơn, nhưng getElementByIdgetElementsByClassNamevẫn lý tưởng cho các mục đích mà tên của chúng mô tả.
một

2
Ồ, và qS/qSAcó thể được sử dụng từ bất kỳ ngữ cảnh phần tử nào, nhưng gEBIchỉ có thể được sử dụng từ documentngữ cảnh.

3
getElementByIdkhớp với các idthuộc tính để tìm các nút DOM, trong khi querySelectortìm kiếm theo bộ chọn. Vì vậy, đối với một selector ví dụ như không hợp lệ <div id="1"></div>, getElementById('1')có thể làm việc trong khi querySelector('#1')sẽ thất bại, trừ khi bạn nói với nó để phù hợp với idthuộc tính (ví dụ querySelector('[id="1"]').
Samuel ELH

3
Chỉ là FYI cho bất kỳ ai đọc bài này, nhưng querySelectorquerySelectorAllhiện đang được hỗ trợ đầy đủ. caniuse.com/#feat=queryselector
Tiếng Telarian

Câu trả lời:


132

"Tốt hơn" là chủ quan.

querySelector là tính năng mới hơn.

getElementByIdđược hỗ trợ tốt hơn querySelector.

querySelectorđược hỗ trợ tốt hơn getElementsByClassName.

querySelectorcho phép bạn tìm các phần tử có quy tắc không thể được diễn đạt bằng getElementByIdgetElementsByClassName

Bạn cần chọn công cụ thích hợp cho bất kỳ nhiệm vụ nào.

(Ở trên, để querySelectorđọc querySelector/ querySelectorAll).


7
hỗ trợ querySelector: caniuse.com/#feat=queryselector
tazboy

2
@JasonVanDerMeijden - Có thể không đáng kể, có thể thay đổi tùy theo trình duyệt.
Quentin

2
Câu trả lời rất tốt và đây là một số bài kiểm tra benchmark
angel.bonev

tại sao hỗ trợ tốt hơn theo thứ tự: getElementById> querySelector> getElementsByClassName, bởi vì tôi nghĩ getElementsByClassNamenên có cùng một mức hỗ trợ như getElementById?
Lei Yang

Câu trả lời này dường như không liên quan đến sự khác biệt giữa các phương pháp, đặc biệt là về hiệu suất.
Dror Bar

43

Các chức năng getElementByIdgetElementsByClassNamerất cụ thể, trong khi querySelectorquerySelectorAllphức tạp hơn. Tôi đoán rằng họ sẽ thực sự có màn trình diễn tệ hơn.

Ngoài ra, bạn cần kiểm tra sự hỗ trợ của từng chức năng trong các trình duyệt mà bạn đang nhắm mục tiêu. Càng mới, khả năng thiếu hỗ trợ hoặc chức năng bị "lỗi" càng cao.


@thomas liên kết của bạn bị lỗi. Có một liên kết làm việc ở bất cứ đâu?
user5508297

6
Có một số phiên bản lưu trữ: web.archive.org/web/20160108040024/http://jsperf.com/… Nhưng thử nghiệm thực sự đã rất cũ (2010), vì vậy kết quả có thể rất khác với các công cụ hiện đại hơn.
thomas

4
Trang được lưu trữ thực sự là động và cho phép bạn chạy lại thử nghiệm trên trình duyệt hiện tại của mình. querySelectorAll vẫn chậm hơn khoảng 37% trên trình duyệt của tôi. (Chrome 71 - vgy.me/TwGL3o.png ) Cũng cần lưu ý rằng getElementById trả về kết quả trực tiếp, nghĩa là nếu bạn thay đổi DOM, thay đổi sẽ được phản ánh bởi kết quả thu được bởi getElementByID (nếu trong phạm vi) trong khi danh sách nút được trả về bởi querySelectorAll là một ảnh chụp nhanh, ví dụ như mọi thứ tại thời điểm cuộc gọi được thực hiện, kết quả sẽ không phản ánh những thay đổi tiếp theo đối với DOM.
W.Prins

nodelist ... is not livebạn có thể cung cấp tài liệu cho điều đó? @ W.Prins cả hai phương thức đều trả về Elementkiểu.
Maximilian Burszley

À, tôi thấy tôi đã mắc lỗi chính tả, xin vui lòng cho tôi xin lỗi! Đáng lẽ tôi phải viết "getElementsByClassName" trong đó tôi đã viết "getElementByID", ví dụ: getElementsByClassName (và tương tự) trả về tập kết quả trực tiếp ". đó là một bức ảnh chụp nhanh.
W.Prins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.