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 namethuộc tính cho một số phần tử và giá trị của idthuộ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ì windowlà đố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 varvà tình cờ nhập idmộ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
namethuộ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 namethuộ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 namesử 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/ .