2010-03-15 35 views
15

Tôi hơi bối rối về cách jQuery lưu trữ dữ liệu với các hàm .data().jQuery lưu trữ dữ liệu bằng .data() như thế nào?

Cái này có tên là expando? Hoặc là điều này sử dụng HTML5 Web Storage mặc dù tôi nghĩ điều này là rất khó xảy ra?

Các tài liệu cho biết: Phương pháp

Các .data() cho phép chúng ta đính kèm dữ liệu của bất kỳ loại các yếu tố DOM trong một cách đó là an toàn từ tham chiếu vòng tròn và do đó từ rò rỉ bộ nhớ.

Khi tôi đọc về expando, dường như có nguy cơ rò rỉ bộ nhớ. Thật không may là các kỹ năng của tôi không đủ để đọc và hiểu mã jQuery, nhưng tôi muốn biết cách jQuery lưu trữ dữ liệu đó bằng cách sử dụng data().

Trả lời

16

Về cơ bản jQuery giữ thông tin bạn lưu trữ/truy xuất với data(name, value)/data(name) và xóa bằng removeData(name) trong đối tượng javascript nội bộ có tên cache. Phần còn lại chỉ là một chút phép thuật javascript để làm cho nó hoạt động và giữ cho tất cả các hiệp hội đúng.

Oh và trả lời phần đầu tiên của câu hỏi của bạn. Không phải là nó mở rộng hay HTML5 WebStorage.

Để sửa chính tôi, tôi nghĩ jQuery sử dụng expando trong một dịp. Nó đặt một thuộc tính trên các thành phần bạn đã sử dụng data() để lưu trữ thông tin cho chúng. Tên thuộc tính trông giống như thế này

"jQuery" + now() //e.g. jQuery1268647073375 

btw. now() là hàm nội bộ trả về (new Date).getTime()

và giá trị là UUID được tạo bởi jQuery.

Bằng cách này jQuery sau này có thể truy xuất dữ liệu được liên kết chính xác từ bộ nhớ cache nội bộ của nó. Vì vậy, nếu bạn lo ngại về expando trong IE, nơi tôi nhớ bạn không thể xóa chúng, thì rò rỉ phải nhỏ nhất vì jQuery chỉ sử dụng 1 expando cho mỗi phần tử bạn lưu trữ dữ liệu.Trừ khi bạn gọi data() trên nghĩa đen 1000s của các yếu tố tôi thấy không có vấn đề bộ nhớ

1

Chức năng data trong jQuery.fn.extend đang sử dụng bản Tuyên Bố này để lưu biến cung cấp:

jQuery.cache[ id ][ name ] = data; 

jQuery.cache chỉ là một đối tượng tiêu chuẩn, định nghĩa là cache: {}, bên jQuery namespace.

Vì vậy, trả lời câu hỏi của bạn - Tôi tin rằng jQuery lưu trữ dữ liệu trong đối tượng JavaScript chuẩn, nội bộ được gọi là cache.

Ồ, và liên quan đến câu hỏi rò rỉ bộ nhớ của bạn - Tôi thực sự không biết. Nếu JavaScript có một số khó khăn khi lưu trữ các tham chiếu đến các phần tử DOM trong đối tượng JS chuẩn thì đây có thể là một vấn đề.

+0

Phiên bản này là gì. Trong 1.4.2 không có dòng như vậy? – jitter

+0

nó là từ http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js – rochal

+1

và btw, ngay cả jQuery 1.4.2 đang sử dụng đối tượng nội bộ được gọi là bộ nhớ cache, do đó, asnwer vẫn hợp lệ. Hơi khác cú pháp, nhưng cùng một câu trả lời. – rochal

-4

của nó đưa vào bộ nhớ cache của trình duyệt tại địa phương giống như một cookie

 from jquery uncompressed: 

if (data !== undefined) { 
      thisCache[ name ] = data; 
     } 
0

Ngoài ra kiểm tra metadata plugin - nó chiết xuất siêu dữ liệu từ một phần tử DOM và trả về nó như một đối tượng (được thảo luận trong các chú thích here).

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