2012-04-29 34 views
5

Tôi đang tìm đến (tự động) có được một danh sách các phần tử HTML trình duyệt hiện nhận thức, chẳng hạn như HTMLPreElement, HTMLSpanElement vv Những đối tượng mang tính toàn cầu, nghĩa làLiệt kê tất cả các thuộc tính của đối tượng cửa sổ?

console.log('HTMLPreElement' in window); //=> true 

Vì vậy, tôi nghĩ rằng tôi muốn được có thể sử dụng getOwnPropertyNames như thế này:

console.log(Object.getOwnPropertyNames(window)); 

để có được danh sách đầy đủ các tính chất toàn cầu (MDN khẳng định rằng đây trả về cả tính đếm được và không đếm được).

Sử dụng ở trên, tôi nhận được một mảng với khoảng 70 thuộc tính cần cẩu. Tuy nhiên, nó không bao gồm các đối tượng như HTMLPreElement - chỉ HTMLElement. Tôi cũng đã cố gắng:

console.log(Object.getOwnPropertyNames(window.Window.prototype)); 

mà mang lại một danh sách lớn hơn (bao gồm cả addEventListener vv) nhưng một lần nữa, không có HTMLPreElement.

Vì vậy, nơi nào các đối tượng cư trú này có các đối tượng HTML{Tag}Element?

+0

Trông như thế này làm việc trong WebKit (chỉ với một đơn giản 'cho ... in') nhưng Firefox từ chối liệt kê chúng. – Graham

+1

Mặc dù thật thú vị khi biết tại sao bạn không thể nhìn thấy nó trong Firefox, điều thú vị là không ít biết tại sao bạn quan tâm ...? – gdoron

+0

@gdoron - lúc đầu tôi chỉ cần một danh sách các thẻ hợp lệ, nhưng khi tôi không thể nhìn thấy chúng tôi đã quan tâm nhiều hơn đến lý do tại sao chúng không xuất hiện. – Graham

Trả lời

3

Trong Firefox, có vẻ như là hành vi của các phần tử mà đối tượng chung của chúng không được thêm trừ khi được yêu cầu một cách rõ ràng dưới dạng biến hoặc thuộc tính chung. Có lẽ Firefox lười biếng tải chúng vào môi trường để chúng không tiêu thụ bộ nhớ trừ khi chúng thực sự cần thiết.

Dường như chúng không hiển thị khi chỉ yêu cầu các khóa của đối tượng toàn cầu qua Object.getOwnPropertyNamestrừ khi trước tiên chúng được tham chiếu rõ ràng như được mô tả ở trên.

http://jsfiddle.net/mBAHm/

+0

Bây giờ tôi có thể xóa câu trả lời sai của tôi ... :) – gdoron

+0

@gdoron: Tôi đã hy vọng rằng tại một số điểm bạn sẽ thêm tất cả thông tin đó vào câu trả lời của bạn ! ;) Hóa ra câu trả lời của bạn là đúng, nhưng Firefox chỉ làm mọi thứ trở nên khó khăn. :) –

4
for (var prop in window) 
    console.log(prop); 

Đó là những gì bạn cần?

+0

Điều đó thậm chí không bao gồm 'HTMLElement' cho tôi ... – Ryan

1
var obj = window; 
while(obj){ 
    for(let prop of Reflect.ownKeys(obj)){ 
     console.log(prop); 
    }; 
    obj = Object.getPrototypeOf(obj); 
}; 
Các vấn đề liên quan