2015-09-09 20 views
7

Làm cách nào để biết sự khác biệt giữa thu thập trực tiếp và không trực tiếp là gì.Sự khác biệt giữa bộ sưu tập trực tiếp và không trực tiếp trong bộ chọn Javascript là gì?

Theo nghiên cứu của tôi:

Một sống là: khi những thay đổi trong DOM được phản ánh trong bộ sưu tập. Nội dung bị thay đổi khi một nút được sửa đổi.

A Không sống là: khi bất kỳ thay đổi nào trong DOM không ảnh hưởng đến nội dung của bộ sưu tập.

document.getElementsByClassName() là một HTMLCollection và đang hoạt động.

document.getElementsByTagName() là một HTMLCollection và đang hoạt động.

document.getElementsByName() là một NodeList và đang hoạt động.

document.querySelectorAll() là một NodeList và không hoạt động.

Tại sao document.querySelectorAll không hoạt động?

Tôi biết rằng:

HTMLCollection chỉ chứa Elements Nodes NodeList chứa phần tử nút và nút Text.

+0

https://www.nczonline.net/blog/2010/09/28/why-is-getelementsbytagname-faster-that-queryselectorall/ – Joseph

Trả lời

3

Những

document.getElementsByClassName() 
document.getElementsByTagName() 
document.getElementsByName() 

đang sống, vì họ là quan sát viên của các bộ sưu tập nội bộ được duy trì bởi động cơ. Việc bảo trì đó không được yêu cầu nghiêm ngặt nhưng rất dễ đạt được.

document.querySelectorAll() 

không hoạt động vì kết quả được tính mỗi khi bạn yêu cầu. Bảo trì bộ sưu tập trực tiếp quá đắt vì mỗi sửa đổi (nội dung, thuộc tính, lớp) của DOM trong trường hợp này sẽ yêu cầu đánh giá lại từng phần tử trong bộ sưu tập - O(N*M) nhiệm vụ trong đó N là số của tất cả các phần tử trong DOM (trường hợp xấu nhất) và số M hoạt động querySelectorAll() bộ sưu tập.

+0

tôi cũng đã nghĩ như vậy, nhưng sau đó CSS ​​áp dụng bộ chọn như vậy nhanh như thế nào ? – dandavis

+0

Thật không may nó không phải là quá nhanh. Để tìm ra tất cả các kiểu của tất cả các phần tử trong DOM là một tác vụ 'O (N * S)' trong đó N là một số phần tử DOM và S là một số quy tắc kiểu (bộ chọn chính xác). Bạn có thể đọc bài viết của tôi ở đây: http://www.terrainformatica.com/2008/07/css-selectors-and-computational-complexity/ –

1

Từ DOM spec

Một bộ sưu tập là một đối tượng đại diện cho một danh sách các nút DOM. A collection có thể là sống hoặc tĩnh. Trừ khi có cách khác đã nêu, số collection phải là live.

Nếu một collectionlive, sau đó các thuộc tính và phương pháp trên rằng đối tượng phải hoạt động trên các dữ liệu cơ bản thực tế, không phải là một bản chụp của dữ liệu.

Khi tạo collection, bộ lọc và gốc được liên kết với nó.

Các collection sau đó đại diện có tầm nhìn ra cây con bén rễ tại gốc 's collection, chỉ chứa các nút phù hợp với trao lọc. Khung nhìn là tuyến tính. Trong trường hợp không có yêu cầu cụ thể đối với ngược lại, các nút trong số collection phải được sắp xếp theo tree order.

Lý do để làm cho querySelectorAll trả lại giá trị tĩnh NodeList có thể cho phép nhiều bộ chọn phức tạp hơn.

Ví dụ: Bộ chọn L4 có thể giới thiệu những thứ như lớp học giả :has(). Có lẽ, vì nó không thể được thực hiện trong một hiệu suất hợp lý, nó sẽ chỉ có sẵn trong querySelectorAll nhưng không có trong bảng định kiểu.

Nếu bộ sưu tập được trả lại bởi querySelectorAll đã hoạt động, thì những bộ chọn phức tạp đó sẽ cần được tính toán lại nhiều lần và điều đó sẽ rất tốn kém.

+0

nếu nó đủ nhanh để áp dụng kiểu, tuy nhiên nhanh/chậm, đó là lý do tại sao isn ' t là đủ nhanh để duy trì một bộ sưu tập? – dandavis

+0

@dandavis Tìm kiếm các yếu tố phù hợp với bộ chọn phức tạp là OK nếu bạn chỉ làm điều đó một lần, nhưng tính toán lại chúng mỗi khi DOM được sửa đổi quá đắt. – Oriol

+0

CSS quản lý để giữ cho chúng được cập nhật mỗi khi DOM được sửa đổi. Tôi đồng ý với câu trả lời của bạn, nó có ý nghĩa, nhưng nó đặt ra câu hỏi về cách stylesheets quản lý đủ nhanh để áp dụng và tiếp tục áp dụng ... – dandavis

Các vấn đề liên quan