2013-06-22 38 views
23

Có cách nào để tìm ra tất cả các thuộc tính cửa sổ do người dùng xác định và các biến (biến toàn cục) trong javascript không?Nhận tất cả thuộc tính cửa sổ do người dùng xác định?

Tôi đã thử console.log(window) nhưng danh sách là vô tận.

+0

Related (nếu không trùng lặp): [Tìm nạp tất cả (javascript) biến toàn cầu trong một trang] (http://stackoverflow.com/q/2226007/1048572), [Javascript - bán phá giá tất cả các biến toàn cầu] (http://stackoverflow.com/q/8369338/1048572) – Bergi

+0

@Bergi: Câu trả lời nào ở đây bao gồm câu hỏi của tôi đã được đánh dấu là một sự lừa dối của điều này? Bạn đang nói câu hỏi là một sự lừa đảo mặc dù câu trả lời là không. Nếu câu trả lời về 'keys()' được chuyển từ câu hỏi của tôi hoặc bạn đang nói rằng một sai lầm và mặc dù câu trả lời ở đây có vẻ lỗi thời một trong số đó là câu trả lời đúng? – hippietrail

+0

@hippietrail: Tôi không hiểu tại sao câu trả lời ở đây sẽ lỗi thời. (Làm thế nào) họ không làm việc cho bạn? Nó dường như chỉ là những gì bạn muốn, nếu tôi không hiểu lầm câu hỏi của bạn. – Bergi

Trả lời

9

Bạn sẽ cần phải làm việc cho chính mình. Đọc trong tất cả các thuộc tính, vào lần đầu tiên bạn có thể. Từ thời điểm đó, bạn có thể so sánh danh sách thuộc tính với danh sách tĩnh của bạn.

var globalProps = [ ]; 

function readGlobalProps() { 
    globalProps = Object.getOwnPropertyNames(window); 
} 

function findNewEntries() { 
    var currentPropList = Object.getOwnPropertyNames(window); 

    return currentPropList.filter(findDuplicate); 

    function findDuplicate(propName) { 
     return globalProps.indexOf(propName) === -1; 
    } 
} 

Vì vậy, bây giờ, chúng ta có thể đi như

// on init 
readGlobalProps(); // store current properties on global object 

và sau

window.foobar = 42; 

findNewEntries(); // returns an array of new properties, in this case ['foobar'] 

Tất nhiên, sự báo trước đây là, bạn chỉ có thể "đóng băng" toàn cầu danh sách thuộc tính tại thời điểm kịch bản của bạn có thể gọi nó là thời gian sớm nhất.

+1

Tôi nghĩ rằng đây sẽ là gần nhất với một câu trả lời hoàn hảo. – andlrc

+0

Nhưng có lẽ bạn nên đề cập đến rằng 'Object.getOwnPropertyNames' là một phần của phiên bản ECMAScript 5. Ngoài ra lọc và Array.indexOf – andlrc

+1

@NULL tốt, tôi đã được sử dụng để đề cập đến nó cho các cặp vợ chồng cuối cùng của tháng, tôi cảm thấy thời gian của mình để di chuyển trên :) – jAndy

-3

Có lẽ đây ?:

for (var property in window) 
{ 
    if (window.hasOwnProperty(property)) 
     console.log(property) 
} 
+3

nó cũng sẽ cung cấp cho trình duyệt được xác định tài sản – bugwheels94

44

Bạn cũng có thể so sánh cửa sổ với phiên bản cửa sổ sạch thay vì cố chụp nhanh trong thời gian chạy để so sánh. Tôi chạy điều này trong giao diện điều khiển nhưng, bạn có thể biến nó thành một hàm.

// make sure it doesn't count my own properties 
(function() { 
    var results, currentWindow, 
    // create an iframe and append to body to load a clean window object 
    iframe = document.createElement('iframe'); 
    iframe.style.display = 'none'; 
    document.body.appendChild(iframe); 
    // get the current list of properties on window 
    currentWindow = Object.getOwnPropertyNames(window); 
    // filter the list against the properties that exist in the clean window 
    results = currentWindow.filter(function(prop) { 
     return !iframe.contentWindow.hasOwnProperty(prop); 
    }); 
    // log an array of properties that are different 
    console.log(results); 
    document.body.removeChild(iframe); 
}()); 
+2

Woah. Đó là chính xác những gì tôi mong đợi câu trả lời cho câu hỏi này được! Cuối cùng tôi có thể thuận tiện poke xung quanh trong mã của người khác :) –

0

này nằm trong tinh thần tương tự như câu trả lời @jungy 's nhưng chúng ta có thể làm điều đó trong 3 dòng:

document.body.appendChild(document.createElement('div')).innerHTML='<iframe id="temoin" style="display:none"></iframe>'; 

for (a in window) if (!(a in window.frames[window.frames.length-1])) console.log(a, window[a]) 

document.body.removeChild($$('#temoin')[0].parentNode); 

Đầu tiên chúng ta thêm một iframe ẩn; sau đó chúng tôi kiểm tra các biến hiện tại dựa vào API JavaScript chuẩn trong iframe; sau đó chúng tôi xóa khung nội tuyến.

Để làm việc thuận tiện hơn, nó có thể hữu ích để sắp xếp kết quả theo thứ tự, và nó vẫn có thể trong một phiên bản 3 dòng:

document.body.appendChild(document.createElement('div')).innerHTML='<iframe id="temoin" style="display:none"></iframe>'; 

Object.keys(window).filter(a => !(a in window.frames[window.frames.length-1])).sort().forEach((a,i) => console.log(i, a, window[a])); 

document.body.removeChild($$('#temoin')[0].parentNode); 

Và nó có thể được đóng gói vào một bookmark:

javascript:document.body.appendChild(document.createElement('div')).innerHTML='<iframe%20id="temoin"%20style="display:none"></iframe>';Object.keys(window).filter(a=>!(a%20in%20window.frames[window.frames.length-1])).sort().forEach((a,i)=>console.log(i,a,window[a]));document.body.removeChild(document.querySelectorAll('#temoin')[0].parentNode);throw 'done'; 
Các vấn đề liên quan