2012-03-16 37 views
10

Xét đoạn mã sau:html yếu tố id như biến javascript

<html> 
<head></head> 
<body> 
<div id='test' class='blah'> 
    <a href='http://somesite.com/' id='someLink'>click!</a> 
</div> 
</body> 
</html> 

Vì vậy, tôi chỉ vừa mới phát hiện ra rằng điều này tạo ra một đối tượng javascript gọi someLink và tôi có thể ví dụ như nhận được giá trị của thuộc tính href với someLink.href. Tôi đã thử nghiệm điều này trong Chrome, FF và IE mới nhất và nó hoạt động.

Trước hết, tính năng "này" được bao lâu? Tôi tưởng tượng có lẽ một thời gian, bởi vì tôi đã biết trong nhiều năm rằng ID cho các phần tử html trên một trang phải là duy nhất, và nếu bạn có nhiều hơn một phần tử chia sẻ cùng một ID, ID cuối cùng sẽ ghi đè (các) trước đó, và sử dụng ví dụ getElementById() sẽ trả về giá trị cuối cùng. Nhưng tôi không bao giờ thực sự hiểu được lý do tại sao, nhưng bây giờ, nhìn vào nó như là một "này là tạo ra một đối tượng" quan điểm, nó có ý nghĩa. Vì vậy, như xa như có thể trực tiếp truy cập nó với các đối tượng id-name-as-javascript ... bao lâu đã được xung quanh? Thời đại IE6? Sớm hơn?

Thứ hai ... Tôi đoán đây là điểm thảo luận nhiều hơn câu hỏi, nhưng ... IMO điều này dường như không phải là một "tính năng" rất tốt ... Có phải toàn bộ vấn đề một hàm DOM và hàm bao bọc như getElementById(), để cung cấp cho một số tổ chức và quan trọng hơn, hãy cắt giảm các vấn đề về không gian tên? Tôi không cảm thấy tôi phải lo lắng về các yếu tố html ngẫu nhiên trên một trang ghi đè lên các biến javascript của tôi (một cái gì đó gần đây đã xảy ra, đó là lý do tại sao tôi phát hiện ra "tính năng" này). Có ai biết lý do tại sao điều này là như vậy, logic đằng sau nó là gì?

+0

"Tôi đã biết trong nhiều năm rằng ID cho các phần tử html trên một trang phải là duy nhất và nếu bạn có nhiều phần tử chia sẻ cùng một ID thì ID cuối cùng sẽ ghi đè (các) thành phần trước đó và sử dụng ví dụ getElementById() sẽ trả về giá trị cuối cùng "Theo như tôi biết,' getElementById() 'sẽ trả về ** đầu tiên **, không phải là phần tử cuối cùng có ID đã cho; mặc dù nó chắc chắn không nhất quán (hoặc, ít nhất, không nên dựa vào sự nhất quán). –

+6

Bạn đánh vào đầu bằng điểm thứ hai. Đó là * không * một tính năng tốt để có, đó là lý do tại sao nó không được chấp nhận từ mãi mãi và sẽ không hoạt động nếu bạn đang sử dụng '' sử dụng nghiêm ngặt "' chỉ thị. – zzzzBov

Trả lời

9

Trước hết, tính năng "này" được bao lâu?

Đây là Microsoft-ism bị cắt xung quanh IE 4 nếu tôi nhớ chính xác.

Một số trình duyệt khác đã thêm hỗ trợ cho nó trong nỗ lực tương thích với mã được viết kém tùy thuộc vào nó. Một số chỉ có thể hỗ trợ nó trong quirks mode.

này dường như không giống như một "tính năng" rất tốt để có

đúng. Không sử dụng nó. :)

3

Có, nó đã được khoảng một thời gian rất dài, đó có thể là lý do duy nhất nó tồn tại. Việc xóa một "tính năng" như vậy sẽ phá vỡ khả năng tương thích với các trang web hiện có, mà các nhà cung cấp trình duyệt rất miễn cưỡng.

Bạn đúng khi nói rằng đó không phải là ý tưởng hay. Đó là một ý tưởng sâu sắc và có thể dẫn đến các xung đột đặt tên cũng như sự ô nhiễm không cần thiết của không gian tên toàn cầu.

+0

Tôi nghĩ rằng "tính năng" được loại bỏ trong '" sử dụng chế độ "' nghiêm ngặt. –

+1

@Rocket: '" sử dụng nghiêm ngặt "' là một tính năng ECMAScript và không ảnh hưởng đến hành vi của DOM. –

0

Đây là một tính năng cũ của IE, không được khuyến nghị sử dụng. Một số trình duyệt thực hiện nó, thường là các thuộc tính không thể đếm được của đối tượng cửa sổ. FF, ví dụ, nó chỉ trong chế độ quirks.

Để đọc thêm, hãy xem bản sao Is there a spec that the id of elements should be made global variable? ...

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