2013-06-22 15 views
23

C'è un modo per scoprire tutte le proprietà e le variabili della finestra definite dall'utente (variabili globali) in javascript?Ottieni tutte le proprietà della finestra definite dall'utente?

Ho provato console.log(window) ma la lista è infinita.

+0

Correlato (se non duplicato): [Recupero di tutte le variabili globali (javascript) in una pagina] (http://stackoverflow.com/q/2226007/1048572), [Javascript - scaricamento di tutte le variabili globali] (http://stackoverflow.com/q/8369338/1048572) – Bergi

+0

@Berg: la risposta qui copre la mia domanda è stato appena contrassegnato come un capriccio di questo? Stai dicendo che la domanda è duplice anche se le risposte non lo sono. La risposta riguardo a 'keys()' può essere spostata dalla mia domanda o stai dicendo che uno è sbagliato e anche se le risposte qui sembrano obsolete, una di queste è la risposta giusta? – hippietrail

+0

@hippietrail: Non vedo perché le risposte qui sarebbero superate. (Come) non funzionano per te? Sembra essere proprio quello che vuoi, se non avessi frainteso la tua domanda. – Bergi

risposta

9

si avrebbe bisogno di fare il lavoro per te. Leggi in tutte le proprietà, la prima volta possibile che puoi. Da quel momento in poi, puoi confrontare l'elenco delle proprietà con quello statico.

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

Così ora, potremmo andare come

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

e successivamente

window.foobar = 42; 

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

Naturalmente, l'avvertenza qui è, che si può solo "congelare" il mondiale elenco delle proprietà nel momento in cui lo script è in grado di chiamarlo il più presto possibile.

+1

Penso che questo sarebbe il più vicino ad una risposta perfetta. – andlrc

+0

Ma forse dovresti menzionare che 'Object.getOwnPropertyNames' fa parte dell'ECMAScript 5 Edition. Anche filtro e Array.indexOf – andlrc

+1

@NULL bene, ero abituato a menzionarlo per l'ultimo paio di mesi, sento il suo momento di andare avanti :) – jAndy

-3

Forse questo ?:

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

darà anche la proprietà definita dal browser – bugwheels94

44

È anche possibile confrontare la finestra con una versione pulita della finestra anziché provare a eseguire lo snapshot durante il runtime per confrontarla. L'ho eseguito in console ma, potresti trasformarlo in una funzione.

// 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. Questo è esattamente quello che mi aspettavo che le risposte a questa domanda fossero! Finalmente posso comodamente curiosare nel codice di altre persone :) –

0

Questo è lo stesso spirito come la risposta @jungy s' ma possiamo farlo in 3 linee:

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

Per prima cosa aggiungere un iframe nascosto; quindi testiamo le variabili esistenti rispetto all'API JavaScript standard nell'iframe; poi togliamo l'iframe.

di lavorare più comodamente, potrebbe essere utile per ordinare i risultati in ordine cronologico, ed è ancora possibile in una versione 3 linee:

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

e può essere imballato in un segnalibro:

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