2013-07-09 14 views
5

Gegeben ist das mein Plugin auf jedem JS-Engine ausgeführt werden kann (in einem Browser oder nicht),Überprüfen Sie, ob es das Fensterobjekt

  • Wie weiß man, dass einige Variable tatsächlich das Objekt Browser window ist.

    Wie weiß ich, ob someVar auf den Browser window Objekt verweist. Gibt es etwas in window, dass ich überprüfen kann, ob es wirklich der Browser window Objekt ist?

  • Und wie überprüft man, ob der Browser window Objekt tatsächlich existiert und nicht nur irgendeine window Variable, die ein Objekt enthält.

    Angenommen, Sie können nicht sagen, ob someVarwindow selbst ist, und Sie wollen es gegen die windowrealen Browser Objekt passen wie someVar === window, wie Sie window bekommt, dass Sie sicher sind, es ist der Browser window und nicht ein anderes Objekt aus einem äußeren Bereich namens window, oder eine andere globale aus einer anderen Umgebung?

Nur ein bisschen mehr zu klären:

  • Ich bin nicht für die globale der Umwelt suchen. Ich suche speziell den Browser window Objekt.
  • Ich überprüfe nicht, ob das Skript im Browser ausgeführt wird.

Ich kann nicht etwas tun, wie if(!window) da window konnte einfach irgendwo außerhalb des Bereichs erklärt ein anderes Objekt sein.

function someFunction(){ 
    var window = {foo:'bar'}; 

    (function(){ 
    console.log(window); //{foo:'bar'} 
    }()); 
} 

Ich kann nicht if(window.window === window) überprüfen, da ich auch Selbstreferenzierung tun kann, und wie bereits erwähnt, window ein Objekt von einem äußeren Umfang sein könnte:

var bar = {}; 
bar.bar = bar; 
bar.bar.bar.bar.bar.bar === bar; //true 

Und das Folgende nicht funktionieren, da Das Skript könnte in etwas anderem als dem globalen Raum eingebettet oder verkettet werden. this könnte auch mit Aufrufen wie call(), apply() oder bind() geändert werden.

//Stand-alone, I can assume window is global since "this" is the global in global space 
(function(window){ 
    //window may not be window 
}(this)); 

//But when this happens 
someNamespace.someFunction = function(){ 

    (function(window){ 
    //window may not be window 
    }(this)); 

} 

//or this: 
someNamespace.someFunction.call({}); 

Ich habe das Gefühl, dass dies ein Duplikat ist, aber ich konnte nicht finden, wo ich es zuerst sah.

+0

möglich Duplikat [Wie überprüft man, ob ein Skript unter node.js läuft?] (Http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –

+0

Es klingt wie du willst d Bestimmen Sie, ob Ihr Code in einem Browser ausgeführt wird oder nicht, indem Sie prüfen, ob ein Fenster vorhanden ist. Sie könnten versuchen, nach Features zu suchen, die ein Browser als Teil eines Fensters wie window.location.href implementiert, aber natürlich ist dies auch nicht fehlersicher. Wie wäre es mit der Feststellung, ob Sie eine gültige userAgent-Zeichenfolge zurückgeben können? – series0ne

+0

Würde '(function() {return this}). Call (null)' immer funktionieren? –

Antwort

-1
if(this.window === this) 

       

+0

"das Skript könnte in etwas anderes als das globale Leerzeichen eingepackt werden" –

+0

dann speichern Sie einen Verweis auf 'this' am Anfang der Datei. Jesus. –

+0

"Das Skript" bezieht sich auf die gesamte Datei, nehme ich an. Keine Notwendigkeit, unhöflich zu sein. –

3

Sie können wie so das globale Objekt erhalten ...

var global = (1,eval)("this"); 
+0

Ist es möglich ohne 'eval' (oder' neue Funktion')? –

+0

@JanDvorak: Ich bin mir ziemlich sicher, dass es nicht ist. –

+1

Ich kann nicht mit '1' char bekommen. Wir führen "eval" auf "this" 'string. Wie ist '1' hier involviert? – Tommi

1

Wie wäre es

function isWindow() { 
    _test = 42; 
    return window && window._test == 42 
} 
+0

außer Sie sollten testen, ob '_test' nicht bereits in' window' vorhanden ist, und wenn ja, testen Sie mit einem anderen Wert. –

+0

Vergessen Sie auch nicht, Ihren Test rückgängig zu machen, nachdem Sie damit fertig sind ;-) –

+0

@JanDvorak: Ja, aber wenn es kein Fenster gibt - wie rolle ich zurück? – georg

2

Dies wird nicht nur Test für aktuelle Fenster, aber für Fenster im Allgemeinen:

window.toString() == "[object Window]"; 
0

Sie können es, wenn Sie einige Methoden nur unterstützt verwenden, indem Sie das Objektfenster Zum Beispiel postmessage:

(function(o){ 
if(!!o.postMessage) console.log("This is my window"); 
else console.log("This isn't my window"); 
})(window); 
0

Ich fand es während der Erstellung Instanzen durch

Verständnis
var MyExampleInstace = function MyExampleInstace() { 
    console.log(this); // returns undefined in strict mode 
    // in not strict mode it will return Window 
} 

new MyExampleInstace(); // will not return and error (this will be fine) 

ich einen Fehler wie

throw new Error('Please use "new" keyword'); 

Wenn jemand versucht MyExampleInstance rufen nicht als Instanz erstellen wollte aber als einfache Funktion wie:

So

das Endergebnis war:

var MyExampleInstace = function MyExampleInstace() { 
    if (this === undefined || this instanceof Window) throw new Error('Please use "new" keyword'); 
} 

das Objekt Um zu überprüfen, ist das Objekt irgendeiner „Art“ die einfachste Weise, die ich durch

gefunden
// myVar could be "this" or every var u need 
// That's also opens the way to check the object instance of your MyExampleInstance 
myVar instanceof Window 

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/instanceof

Verwandte Themen