Như đã đề cập trong câu trả lời trước, hành vi này được gọi là quyền truy cập được đặt tên trên đối tượng cửa sổ . Giá trị của name
thuộc tính cho một số phần tử và giá trị của id
thuộc tính cho tất cả các phần tử được cung cấp dưới dạng các thuộc tính của window
đối tượng toàn cục . Chúng được gọi là các yếu tố được đặt tên. Vì window
là đối tượng toàn cầu trong trình duyệt, mỗi phần tử được đặt tên sẽ có thể truy cập dưới dạng biến toàn cục.
Điều này ban đầu được thêm vào bởi Internet Explorer và cuối cùng được thực hiện bởi tất cả các trình duyệt khác chỉ để tương thích với các trang web phụ thuộc vào hành vi này. Thật thú vị, Gecko (công cụ kết xuất của Firefox) đã chọn chỉ thực hiện điều này ở chế độ quirks , trong khi các công cụ kết xuất khác để nó ở chế độ tiêu chuẩn.
Tuy nhiên, kể từ Firefox 14, Firefox hiện cũng hỗ trợ truy cập có tên trên window
đối tượng ở chế độ tiêu chuẩn. Tại sao họ thay đổi điều này? Hóa ra vẫn còn rất nhiều trang web dựa vào chức năng này trong chế độ tiêu chuẩn. Microsoft thậm chí đã phát hành một bản demo tiếp thị đã làm, ngăn không cho bản demo hoạt động trong Firefox.
Webkit gần đây đã xem xét điều ngược lại , chỉ loại bỏ quyền truy cập có tên trên window
đối tượng sang chế độ quirks. Họ quyết định chống lại nó bằng lý do tương tự như Gecko.
Vì vậy, điên rồ vì dường như hành vi này hiện an toàn về mặt kỹ thuật để sử dụng trong phiên bản mới nhất của tất cả các trình duyệt chính ở chế độ tiêu chuẩn . Nhưng trong khi truy cập được đặt tên có vẻ hơi thuận tiện, nó không nên được sử dụng .
Tại sao? Rất nhiều lý do có thể được tóm tắt trong bài viết này về lý do tại sao các biến toàn cầu là xấu . Nói một cách đơn giản, việc có một loạt các biến toàn cầu bổ sung dẫn đến nhiều lỗi hơn. Giả sử bạn vô tình nhập tên của a var
và tình cờ nhập id
một nút DOM, SURPRISE!
Ngoài ra, mặc dù đã được chuẩn hóa, vẫn còn khá nhiều điểm khác biệt trong việc triển khai truy cập có tên của trình duyệt.
- IE không chính xác làm cho giá trị của
name
thuộc tính có thể truy cập được đối với các thành phần của biểu mẫu (đầu vào, chọn, v.v.).
- Tắc kè và Webkit không chính xác KHÔNG làm cho
<a>
các thẻ có thể truy cập thông qua name
thuộc tính của chúng .
- Tắc kè xử lý không chính xác nhiều phần tử được đặt tên có cùng tên (nó trả về một tham chiếu đến một nút thay vì một mảng các tham chiếu).
Và tôi chắc chắn sẽ có nhiều hơn nếu bạn thử sử dụng quyền truy cập có tên trên các trường hợp cạnh.
Như đã đề cập trong các câu trả lời khác, sử dụng document.getElementById
để có được một tham chiếu đến nút DOM id
. Nếu bạn cần lấy một tham chiếu đến một nút bằng cách name
sử dụng thuộc tính của nó document.querySelectorAll
.
Xin vui lòng, không truyền bá vấn đề này bằng cách sử dụng quyền truy cập có tên trong trang web của bạn. Vì vậy, nhiều nhà phát triển web đã lãng phí thời gian để cố gắng theo dõi hành vi kỳ diệu này . Chúng tôi thực sự cần phải hành động và nhận các công cụ kết xuất để tắt quyền truy cập có tên trong chế độ tiêu chuẩn. Trong ngắn hạn, nó sẽ phá vỡ một số trang web làm những điều xấu, nhưng về lâu dài, nó sẽ giúp đưa web về phía trước.
Nếu bạn quan tâm, tôi sẽ nói về vấn đề này chi tiết hơn trên blog của mình - https://www.tjaugeoll.com/2012/07/19/dom-element-references-as-global-variabled/ .