Có cách nào tốt để gắn các đối tượng JavaScript vào các phần tử HTML không?


96

Tôi muốn liên kết một đối tượng JavaScript với một phần tử HTML. Có một cách đơn giản để làm điều này?

Tôi nhận thấy HTML DOM định nghĩa một phương thức setAttribute và có vẻ như điều này được xác định cho tên thuộc tính tùy ý. Tuy nhiên điều này chỉ có thể đặt giá trị chuỗi. (Tất nhiên, bạn có thể sử dụng điều này để lưu trữ các khóa vào từ điển.)

Chi tiết cụ thể (mặc dù tôi chủ yếu quan tâm đến câu hỏi chung):

Cụ thể, tôi có các phần tử HTML đại diện cho các nút trong một cây và tôi đang cố bật tính năng kéo và thả, nhưng sự kiện thả jQuery sẽ chỉ cung cấp cho tôi các phần tử đang được kéo và thả.

Mô hình bình thường để nhận thông tin đến trình xử lý sự kiện dường như là tạo các phần tử HTML cùng lúc khi bạn đang tạo các đối tượng JavaScript và sau đó xác định trình xử lý sự kiện bằng cách đóng trên các đối tượng JavaScript này - tuy nhiên điều này không hoạt động quá tốt trong điều này trường hợp (Tôi có thể có một đối tượng toàn cục được phổ biến khi quá trình kéo bắt đầu ... nhưng điều này cảm thấy hơi khó chịu).

Câu trả lời:


44

Bạn đã xem phương thức jQuery data () chưa? Bạn có thể gán các đối tượng phức tạp cho phần tử nếu bạn muốn hoặc bạn có thể tận dụng phương thức đó để giữ ít nhất một tham chiếu đến một đối tượng (hoặc một số dữ liệu khác).


8
Cảm ơn bạn: Đây là khá nhiều những gì tôi đang tìm kiếm. Điều thú vị là định nghĩa phương thức này jquery lưu trữ các khóa vào một từ điển toàn cục trong một thuộc tính chuỗi trên mỗi phần tử. Tên của thuộc tính chuỗi này được tạo ngẫu nhiên khi jquery được tải lần đầu tiên. (Gợi ý rằng có không phải là một cách tốt để làm ở đó không phải là một cách đẹp hơn để làm điều này chỉ sử dụng DOM)
user47741

6
Cần lưu ý rằng jQuery data() hoạt động bằng cách sử dụng câu trả lời mà bobince đã đưa ra, vì vậy nếu bạn chưa sử dụng jquery, bạn cũng có thể sử dụng câu trả lời đó.
Eamon Nerbonne

6
Thật buồn cười làm sao tôi có thể nhìn lại câu trả lời này vào 6 năm sau và nghĩ, "đây là một câu trả lời rất tối ưu. @Bobince lẽ ra phải có một câu được chấp nhận".
Phil.Wheeler

6
Không có thẻ jQuery trong câu hỏi này.
Michał Perłakowski

111

Các đối tượng JavaScript có thể có các thuộc tính tùy ý được gán cho chúng, không có gì đặc biệt bạn phải làm để cho phép nó. Điều này bao gồm các phần tử DOM; mặc dù hành vi này không phải là một phần của tiêu chuẩn DOM, nhưng nó đã trở lại với các phiên bản đầu tiên của JavaScript và hoàn toàn đáng tin cậy.

var div= document.getElementById('nav');
div.potato= ['lemons', 3];

5
@ tat.wright - Các thuộc tính tùy ý trên các phần tử HTML mà anh ấy đang nói đến được gọi là thuộc tính Expando. Cũng lưu ý rằng div.potato không div.getAttribute bình ( "khoai tây")
nickytonline

36
@Tim Down: vậy thì đừng làm vậy. Tôi không hiểu tại sao nó không đáng tin cậy - nó giống như nói rằng đối tượng String là không đáng tin cậy, bởi vì bạn có thể đặt nó thành null.
simon 10/09/09

5
@TimDown: Nhưng cũng không đặt document.expando = falsengắt jQuery.data ?
Joey Adams

8
Theo kinh nghiệm của tôi, lý do điều này có thể tồi tệ là có thể bị rò rỉ bộ nhớ. Có thể có một cách dễ dàng để tránh nó, nhưng khi tôi tạo ra một thiết kế sử dụng nhiều điều này, nó đã bị rò rỉ nhiều bộ nhớ. Tôi nghĩ bạn phải hết sức cẩn thận vì việc đếm tham chiếu không được xử lý cho bạn (không được làm sạch) nếu phần tử bị xóa khỏi trang và có thể là ngược lại.
eselk

7
Cảnh báo công bằng: Tôi đã rất vui khi làm những gì câu trả lời mô tả, nhưng thay vì tên trường "khoai tây", tôi đã sử dụng "phạm vi". Hóa ra "phạm vi" là một thuộc tính của các phần tử ô trong bảng ( <td>) và đối tượng tôi đã gán cho trường này là # toString'ed. Tôi rất bối rối khi thấy td.scope === '[object Object]'.
David Groomes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.