2011-09-18 26 views
5

Với CSS này:Trình duyệt không quan sát những thay đổi để đĩa dữ liệu *, tính chọn thuộc tính CSS không render

[data-myplugin-object="blue-window"]{ 
    background-color: #00f; 
} 

[data-myplugin-object="red-window"]{ 
    background-color: #f00; 
} 

Và jQuery này:

$('[data-myplugin-object="blue-window"]').each(function(event){ 
    $(this).data({ 
     'myplugin-object': 'red-window' 
    }); 
}); 

Và đoạn mã HTML này:

<div data-myplugin-object="blue-window"> 
    <p>Hello world</p> 
</div> 

Bây giờ, người ta sẽ mong đợi rằng khi đoạn mã jQuery được thực thi (được trì hoãn đúng cho đến tải trang hoàn tất khóa học) cửa sổ màu xanh lam của tôi (, lần đầu hiển thị màu xanh) sẽ chuyển sang màu đỏ.

Không, chắc chắn là không; và sử dụng Firebug và Công cụ dành cho nhà phát triển trong Firefox và Chrome tương ứng, tôi không thể quan sát bất kỳ thay đổi nào đối với thuộc tính data-*.

Để trình duyệt (và hộp công cụ DOM cho vấn đề đó) để quan sát các thay đổi, tôi có cần hoàn nguyên về .attr() hoặc có giải pháp cho việc này không?

Trả lời

11

jQuery.data() thuộc tính không thực sự được lưu trữ trên đối tượng DOM trong jQuery. Đối tượng DOM được gắn thẻ với một ID jQuery duy nhất và dữ liệu thực tế được lưu trữ trong một cấu trúc dữ liệu javascript riêng biệt. Trong số các lý do khác, jQuery thực hiện theo cách này để ngăn chặn các lỗi rò rỉ bộ nhớ tham chiếu vòng tròn có thể xảy ra trong một số trình duyệt khi giá trị dữ liệu là tham chiếu đến các đối tượng DOM khác.

Nếu bạn muốn thay đổi các thuộc tính DOM thực tế, tôi muốn đề nghị thiết lập các thuộc tính trực tiếp cho mình như thế này:

obj.attr("data-myplugin-object", "red-window"); 

Mặc dù, cho những gì bạn đang làm, tôi nghĩ rằng hầu hết mọi người sẽ sử dụng thêm/loại bỏ/thay đổi tên lớp CSS, không phải thuộc tính tùy chỉnh vì đó là cách phổ biến để thay đổi quy tắc CSS nào áp dụng cho đối tượng.

<div id="myObj" class="blueWindow"> 
    <p>Hello world</p> 
</div> 

.blueWindow {background-color: #00F;} 
.redWindow {background-color: #F00;} 

$("#myObj").removeClass("blueWindow").addClass("redWindow"); 

Hoặc nếu không có các lớp khác trên đối tượng:

$("#myObj").attr("class", "redWindow"); 
+1

Cảm ơn @ jfriend00 - lớp CSS rõ ràng phù hợp hơn đối với trường hợp độc quyền kiểu dáng các yếu tố, tuy nhiên tôi đang làm việc trên một plugin và muốn triển khai một số kiểu mặc định dựa trên sự liên quan ngữ nghĩa của thuộc tính tùy chỉnh (* liên quan đến bố cục *) Tất nhiên, chúng được ghi đè bằng bộ chọn CSS có độ đặc hiệu cao hơn (* chẳng hạn như '.classes' *) trường hợp, nếu phương thức '.attr()' là cược tốt nhất của tôi, thì đó là hướng tôi sẽ đi. '.data()' có cung cấp bất kỳ chức năng cơ bản nào khác có thể bị mất với thay đổi này không? (* ngoài bản đồ hỗ trợ, vv *) – Dan

+1

Chức năng bổ sung chính mà tôi biết về '.data()' có liên quan đến các liên kết bộ nhớ khi sử dụng những thứ khác ngoài các chuỗi đơn giản (ví dụ: tham chiếu đối tượng). Nó không chỉ ngăn chặn các tham chiếu DOM vòng tròn, mà nó còn đảm bảo rằng mọi thứ có tham chiếu thông qua '.data()' được xóa sạch nếu bạn loại bỏ đối tượng DOM thông qua jQuery. Nếu bạn chỉ sử dụng chuỗi, tôi không nghĩ rằng nó cung cấp nhiều chức năng bổ sung cho bạn. Nếu bạn đang làm nó rất nhiều, bạn có thể muốn xem xét hiệu suất và sử dụng bộ nhớ của một thuộc tính DOM so với cách jQuery. – jfriend00

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