2013-06-22 10 views
23

Gibt es eine Möglichkeit, alle benutzerdefinierten Fenstereigenschaften und Variablen (globale Variablen) in Javascript zu finden?Erhalten Sie alle benutzerdefinierten Fenstereigenschaften?

Ich versuchte console.log(window), aber die Liste ist endlos.

+0

Verwandte (wenn nicht doppelt): [Abrufen aller (javascript) globalen Variablen auf einer Seite] (http://stackoverflow.com/q/2226007/1048572), [Javascript - Dumping aller globalen Variablen] (http://stackoverflow.com/q/8369338/1048572) – Bergi

+0

@Bergi: Welche Antwort deckt hier meine Frage ab wurde gerade als ein Betrüger von diesem markiert? Sagst du, die Frage ist ein Betrogener, obwohl die Antworten nicht sind. Sollte die Antwort zu 'keys()' aus meiner Frage entfernt werden oder sagst du, dass jemand falsch liegt und obwohl die Antworten hier veraltet aussehen, ist eine davon die richtige Antwort? – hippietrail

+0

@hippietrail: Ich verstehe nicht, warum die Antworten hier veraltet sein würden. (Wie) funktionieren sie nicht für dich? Es scheint genau das zu sein, was du willst, wenn ich deine Frage nicht missverstanden habe. – Bergi

Antwort

9

Sie müssten die Arbeit für sich selbst tun. Lesen Sie in allen Eigenschaften, zur ersten möglichen Zeit, die Sie können. Von diesem Punkt an können Sie die Eigenschaftsliste mit Ihrer statischen vergleichen.

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

So, jetzt konnten wir wie

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

gehen und später

window.foobar = 42; 

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

Natürlich ist der Nachteil hier ist, dass Sie nur "Einfrieren" der globalen Property-Liste zu dem Zeitpunkt, an dem Ihr Skript es als früheste Zeit bezeichnen kann.

+1

Ich denke, das wäre am nächsten zu einer perfekten Antwort. – andlrc

+0

Aber vielleicht sollten Sie erwähnen, dass 'Object.getOwnPropertyNames' Teil der ECMAScript 5 Edition ist. Auch Filter und Array.IndexOf – andlrc

+1

@NULL gut, ich war es, um es für die letzten paar Monate zu erwähnen, fühle ich seine Zeit, um weiterzugehen :) – jAndy

-3

Vielleicht ?: diese

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

es wird auch Browser definierte Eigenschaft geben – bugwheels94

44

Sie können das Fenster auch mit einer sauberen Version des Fensters vergleichen, anstatt zu versuchen, während der Laufzeit einen Snapshot zu erstellen, um es zu vergleichen. Ich habe das in der Konsole ausgeführt, aber Sie könnten es in eine Funktion verwandeln. Diese

// 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. Das war genau das, was ich von den Antworten auf diese Frage erwartete! Endlich kann ich bequem im Code anderer Leute herumstochern :) –

0

ist in dem gleichen Geist wie @jungy ‚s Antwort, aber wir können es in 3 Zeilen tun:

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

Zuerst fügen wir einen versteckten iframe; dann testen wir vorhandene Variablen gegen die Standard-JavaScript-API im iframe; dann entfernen wir den iframe.

bequemer zu arbeiten, ist es sinnvoll sein könnte, die Ergebnisse in chronologischer Reihenfolge zu sortieren, und es ist immer noch möglich, in einer 3-Zeilen-Version:

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

Und es kann in ein Lesezeichen verpackt werden:

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