2013-06-22 5 views
23

Есть ли способ узнать все пользовательские свойства и переменные окна (глобальные переменные) в javascript?Получить все пользовательские свойства окна?

Я пробовал console.log(window), но список бесконечен.

+0

Связанный (если не дубликат): [Получение всех (javascript) глобальных переменных на странице] (http://stackoverflow.com/q/2226007/1048572), [Javascript - сброс всех глобальных переменных] (http://stackoverflow.com/q/8369338/1048572) – Bergi

+0

@Bergi: Какой ответ здесь охватывает мой вопрос, который был просто отмечен как обман этого? Вы говорите, что вопрос является обманом, хотя ответов нет. Если ответ на вопрос о 'keys()' будет перенесен из моего вопроса или вы говорите, что это неправильно, и хотя ответы здесь выглядят устаревшими, один из них - правильный ответ? – hippietrail

+0

@hippietrail: Я не понимаю, почему ответы здесь устарели. (Как) они не работают на вас? Кажется, это именно то, что вы хотите, если бы я не понял ваш вопрос неправильно. – Bergi

ответ

9

Вы должны были бы сделать работу для себя. Читайте во всех свойствах, в первый раз, когда сможете. С этого момента вы можете сравнить список свойств со своим статическим.

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; 
    } 
} 

Итак, мы могли бы пойти как

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

и позже

window.foobar = 42; 

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

Конечно, Предостережение в том, что вы только можете "заморозить" глобальный список свойств в то время, когда ваш скрипт может называть его самым ранним временем.

+1

Я думаю, что это будет ближе всего к идеальному ответу. – andlrc

+0

Но, возможно, вам стоит упомянуть, что 'Object.getOwnPropertyNames' является частью ECMAScript 5 Edition. Также фильтр и Array.indexOf – andlrc

+1

@NULL хорошо, я привык упоминать об этом за последние пару месяцев, я чувствую, что настало время двигаться дальше :) – jAndy

-3

Может быть, это ?:

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

он также даст свойство, определенное браузером – bugwheels94

44

Вы также можете сравнить окно с чистой версией окна, а не пытаться сделать снимок во время выполнения для сравнения. Я запускал это в консоли, но вы можете превратить его в функцию.

// 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. Это именно то, что я ожидал от ответов на этот вопрос! В конце концов, я могу удобно ткнуть в чужой код :) –

0

Это в том же духе, как ответ @jungy «ы, но мы можем сделать это в 3-х линий:

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); 

Сначала мы добавим скрытый IFRAME; то мы тестируем существующие переменные на стандартный JavaScript API в iframe; то мы удалим iframe.

Чтобы работать более удобно, это может быть полезно для сортировки результатов в хронологическом порядке, и это все еще возможно в версии с 3 линии:

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); 

И это может быть упаковано в закладки:

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'; 
Смежные вопросы