Tôi biết câu hỏi này là cũ nhưng tôi nghĩ rằng nó cần một chút làm rõ như một số các câu trả lời ở đây là lỗi thời như W3C thay đổi định nghĩa, và hậu quả là giá trị trả về của các phương pháp này getElementsByTagName()
và getElementsByClassName()
Những phương pháp này tính đến thời điểm viết câu trả lời này trả về một đối tượng - trống hoặc không - thuộc loại HTMLCollection
và khôngNodeList
.
Nó giống như sự khác biệt giữa các thuộc tính children
mà trả về một đối tượng kiểu HTMLCollection
vì nó chỉ bao gồm các yếu tố và loại trừ văn bản hoặc nhận xét các nút, và childNodes
mà trả về một đối tượng kiểu NodeList
vì nó có thể chứa các loại nút khác như văn bản và nhận xét là tốt.
Lưu ý: Tôi sẽ tiếp tục ở đây và thể hiện sự thiếu hiểu biết của mình về lý do tại sao phương pháp querySelectorAll()
trả về NodeList
chứ không phải HTMLCollection
vì nó hoạt động độc quyền trên các nút phần tử trong tài liệu và không có gì khác.
Có lẽ nó có liên quan đến khả năng phủ sóng của các loại nút khác trong tương lai và họ đã tìm giải pháp chứng minh tương lai hơn, ai biết thực sự? :)
EDIT: Tôi nghĩ rằng tôi có lý do đằng sau quyết định này để chọn một số NodeList
và không phải là HTMLCollection
cho số querySelectorAll()
.
Vì chúng đã xây dựng HTMLCollection
độc quyền và hoàn toàn trực tiếp và vì phương pháp này không cần chức năng trực tiếp này nên họ đã quyết định triển khai NodeList
thay vì phục vụ tốt nhất mục đích kinh tế và hiệu quả.
Nguồn
2015-03-20 14:00:17
Không, bạn không thể gọi trực tiếp phương thức trên 'NodeList', vì chỉ mục của nó không thể ghi. Nó sẽ ném một lỗi. – Bergi
ES6: 'arrayNodes = Array.from (listNodes)' – cregox