2012-04-27 20 views

Trả lời

8

Disclaimer:I’m the guy who tweeted that :) Đó là một câu hỏi tôi sẽ hỏi và câu trả lời trong tôi Front-Trends nói chuyện. Tôi đã viết tweet đó 5 phút trước khi lên sân khấu.


Vì giới hạn 140 ký tự trên Twitter, câu hỏi hơi mơ hồ. Câu hỏi thực sự tôi hỏi là như sau.

Các ECMAScript đặc tả defines ToBoolean() as follows:

ToBoolean(condition), slide from my Front-Trends 2012 talk

Như bạn có thể thấy, tất cả đối tượng phi nguyên thủy (tức là tất cả các đối tượng mà không phải là một boolean, một số, một chuỗi, undefined, hoặc null) là sự thật theo spec. Tuy nhiên, trong DOM, có một ngoại lệ cho điều này - một đối tượng DOM bị lỗi. Bạn có biết cái nào? Câu trả lời là document.all. The HTML spec nói:

Thuộc tính all phải trả lại một HTMLAllCollection bắt rễ tại Document nút, có bộ lọc phù hợp với tất cả các yếu tố này.

Đối tượng được trả về cho tất cả có một số hành vi bất thường:

Các user agent phải hành động như thể ToBoolean() điều hành trong JavaScript chuyển đổi đối tượng được trả về cho all với giá trị false.

Các user agent phải hành động như thể, đối với các mục đích của ==!= nhà khai thác trong JavaScript, đối tượng được trả về cho all là bằng giá trị undefined.

Các user agent phải hành động như vậy mà typeof điều hành trong JavaScript trả về chuỗi 'undefined' khi áp dụng cho các đối tượng được trả về cho all.

Các yêu cầu này là một sự vi phạm cố ý của JavaScript đặc điểm kỹ thuật hiện tại tại thời điểm viết (ấn bản ECMAScript 5). Đặc tả JavaScript yêu cầu toán tử ToBoolean() chuyển đổi tất cả các đối tượng thành giá trị true và không có quy định cho các đối tượng hoạt động như thể là undefined cho mục đích một số toán tử nhất định. Vi phạm này được thúc đẩy bởi khả năng tương thích với hai lớp nội dung cũ: một mức sử dụng sự hiện diện của document.all như một cách để phát hiện tác nhân người dùng cũ và . mà không kiểm tra sự hiện diện của nó trước.

Vì vậy, document.all là ngoại lệ chính thức duy nhất cho quy tắc ECMAScript này. (Trong Opera, document.attachEvent vv cũng bị lỗi, nhưng đó không phải là bất cứ nơi nào.)

1

Đây là document.all.

Không chuẩn, vì vậy bạn nên sử dụng document.getElementsByTagName("*").

+0

Từ fiddle này nó không có vẻ là http://jsfiddle.net/V8GaH/ –

+0

fiddle kiểm tra của bạn document.getElementsByTagName không document.all – GillesC

+0

Bạn đang thử nghiệm điều sai trái, chắc chắn? http://jsfiddle.net/CPVAf/1/ – stusmith

0

Chỉ cần lặp trên tài liệu và kiểm tra tất cả ..

http://jsfiddle.net/UTNkW/3/

EDIT: phương pháp kiểm tra sai, may mắn một ai đó chĩa ra và tôi có thể sửa chữa nó.

+0

Bài kiểm tra của tôi không phát hiện ra nó như trong danh sách. Mã của tôi chăm sóc giá trị không null, đó là lý do tại sao có 2! và không phải là duy nhất, cái đầu tiên sẽ trả về true nếu giá trị là không xác định, false hoặc null và giá trị thứ hai sẽ trả về false. nếu nó không nằm trong danh sách được tạo bởi bản trình diễn jsfiddle .... – GillesC

+0

Tôi sợ phương pháp kiểm tra của bạn không chính xác. Ví dụ: bạn thiếu kiểm tra các giá trị không phải ''. Hãy nhớ rằng chúng ta chỉ đang nói về các đối tượng không nguyên thủy (vì vậy tất cả các đối tượng không phải là một boolean, một số, một chuỗi, 'undefined', hoặc' null'). –

+0

Thử nghiệm của bạn trả về một số giá trị 'null', là các giá trị nguyên thủy. Xem ví dụ 'document.nextSibling'. Chúng tôi chỉ tìm kiếm những đồ vật không nguyên thủy. –

1

Ok, sử dụng mã này

for (var name in document) { 
    if (!!document[name] === false && typeof document[name] === 'object' && document.hasOwnProperty(name)) { 
     $('#foo').append('document.' + name + '<br />');   
    }; 
};​ 

tôi đã có kết quả này trong chrome (kết quả có thể thay đổi)

document.ownerDocument 
document.attributes 
document.namespaceURI 
document.nextSibling 
document.webkitCurrentFullScreenElement 
document.nodeValue 
document.preferredStylesheetSet 
document.textContent 
document.previousSibling 
document.parentNode 
document.xmlVersion 
document.parentElement 
document.localName 
document.selectedStylesheetSet 
document.prefix 
document.xmlEncoding 
+1

Tôi sợ phương pháp kiểm tra của bạn là không chính xác. Ví dụ: bạn thiếu kiểm tra các giá trị không null. Hãy nhớ rằng chúng ta chỉ đang nói về các đối tượng không nguyên thủy (vì vậy tất cả các đối tượng không phải là một boolean, một số, một chuỗi, 'undefined', hoặc' null'). Cũng lưu ý rằng 'typeof document.all == 'undefined'' mặc dù đó là một đối tượng, do đó, kiểm tra của bạn sẽ không phát hiện được. –

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