Tôi nghĩ Tim đã nói điều đó khá tốt , nhưng hãy lùi lại:
Một phần tử DOM là một đối tượng, một vật trong bộ nhớ. Giống như hầu hết các đối tượng trong OOP, nó có các thuộc tính . Nó cũng, riêng biệt, có một bản đồ của các thuộc tính được xác định trên thành phần (thường đến từ đánh dấu mà trình duyệt đọc để tạo thành phần). Một số các phần tử thuộc tính được họ ban đầu giá trị từ các thuộc tính với tên giống hoặc tương tự ( value
được giá trị ban đầu của nó từ thuộc tính "giá trị"; href
được giá trị ban đầu của nó từ thuộc tính "href", nhưng đó là không chính xác giá trị như nhau; className
từ thuộc tính "lớp"). Các thuộc tính khác nhận các giá trị ban đầu của chúng theo các cách khác: Chẳng hạn, thuộc parentNode
tính nhận giá trị của nó dựa trên thành phần chính của nó là gì;style
tài sản, cho dù nó có thuộc tính "phong cách" hay không.
Hãy xem xét neo này trong một trang tại http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
Một số nghệ thuật ASCII vô cớ (và bỏ đi rất nhiều thứ):
+ + +
| HTMLAnchorEuity |
+ + +
| href: "http://example.com/foo.html" |
| tên: "fooAnchor" |
| id: "fooAnchor" |
| className: "kiểm tra một" |
| thuộc tính: |
| href: "foo.html" |
| tên: "fooAnchor" |
| id: "fooAnchor" |
| lớp: "kiểm tra một" |
+ + +
Lưu ý rằng các thuộc tính và thuộc tính là khác biệt.
Bây giờ, mặc dù chúng là khác biệt, bởi vì tất cả những thứ này phát triển thay vì được thiết kế từ đầu, một số thuộc tính ghi lại thuộc tính mà chúng bắt nguồn từ nếu bạn đặt chúng. Nhưng không phải tất cả đều như vậy, và như bạn có thể thấy từ href
phía trên, ánh xạ không phải lúc nào cũng là "truyền giá trị" thẳng, đôi khi có sự diễn giải liên quan.
Khi tôi nói về các thuộc tính là thuộc tính của một đối tượng, tôi không nói một cách trừu tượng. Đây là một số mã không phải jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Các giá trị đó theo hầu hết các trình duyệt; có một số biến thể.)
Đối link
tượng là một vật thật và bạn có thể thấy có một sự khác biệt thực sự giữa việc truy cập một thuộc tính trên nó và truy cập một thuộc tính .
Như Tim đã nói, phần lớn thời gian, chúng tôi muốn làm việc với các tài sản. Một phần đó là vì giá trị của chúng (thậm chí tên của chúng) có xu hướng phù hợp hơn trên các trình duyệt. Chúng tôi hầu như chỉ muốn làm việc với các thuộc tính khi không có thuộc tính liên quan đến nó (thuộc tính tùy chỉnh) hoặc khi chúng tôi biết rằng đối với thuộc tính cụ thể đó, thuộc tính và thuộc tính không phải là 1: 1 (như với href
và "href" ở trên) .
Các thuộc tính tiêu chuẩn được trình bày trong các thông số DOM khác nhau:
Những thông số kỹ thuật này có chỉ số tuyệt vời và tôi khuyên bạn nên giữ liên kết đến chúng tiện dụng; Tôi sử dụng tất cả các thời gian.
Chẳng hạn, các thuộc tính tùy chỉnh sẽ bao gồm bất kỳ data-xyz
thuộc tính nào bạn có thể đặt vào các phần tử để cung cấp siêu dữ liệu cho mã của bạn (bây giờ, đó là hợp lệ của HTML5, miễn là bạn tuân theo data-
tiền tố). (Các phiên bản gần đây của jQuery cung cấp cho bạn quyền truy cập vào data-xyz
các phần tử thông qua data
hàm, nhưng hàm đó không chỉ là một trình truy cập cho các data-xyz
thuộc tính [nó thực hiện nhiều hơn và ít hơn thế]; trừ khi bạn thực sự cần các tính năng của nó, tôi sẽ sử dụng attr
hàm để tương tác với data-xyz
thuộc tính.)
Các attr
chức năng đã từng có một số logic phức tạp xung quanh nhận được những gì họ nghĩ bạn muốn, chứ không phải theo nghĩa đen nhận được thuộc tính. Nó kết hợp các khái niệm. Di chuyển đến prop
và attr
có nghĩa là để khử chúng. Một thời gian ngắn trong v1.6.0 jQuery đã đi quá xa trong vấn đề đó, nhưng chức năng đã nhanh chóng được bổ sung trở lại để attr
xử lý các tình huống phổ biến mà mọi người sử dụng attr
khi về mặt kỹ thuật họ nên sử dụng prop
.