Ottieni tutte le proprietà della finestra definite dall’utente?

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

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

Dovresti fare il lavoro da solo. Leggi in tutte le proprietà, la prima volta ansible 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; } } 

Quindi ora potremmo andare

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

e più tardi

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

Ovviamente, l’avvertimento qui è che puoi solo “congelare” l’elenco delle proprietà globali nel momento in cui lo script è in grado di chiamarlo il più presto ansible.

È anche ansible 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); }()); 

Questo è nello stesso spirito della risposta di @jungy ma possiamo farlo in 3 righe:

 document.body.appendChild(document.createElement('div')).innerHTML=''; 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 aggiungiamo un iframe nascosto; quindi testiamo le variabili esistenti rispetto all’API JavaScript standard nell’iframe; poi togliamo l’iframe.

Per lavorare più comodamente, potrebbe essere utile ordinare i risultati in ordine cronologico, ed è ancora ansible in una versione a 3 linee:

 document.body.appendChild(document.createElement('div')).innerHTML=''; 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 inserito in un segnalibro:

 javascript:document.body.appendChild(document.createElement('div')).innerHTML='';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'; 

Forse questo?:

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