2013-07-09 7 views
5

Biorąc pod uwagę, że mój wtyczki mogą być uruchamiane na dowolnym silnikiem JS (w przeglądarce lub nie),Sprawdź, czy jest to obiekt okno

  • Skąd wiadomo, że niektóre zmienna jest faktycznie przedmiotem przeglądarka window.

    Podobnie jak wiem, czy someVar odnosi się do obiektu przeglądarki window. Czy jest coś takiego w window, że mogę sprawdzić, czy to naprawdę obiekt przeglądarki o nazwie window?

  • A jak sprawdzić, czy obiekt przeglądarki rzeczywiście istnieje, a nie tylko niektóre zmienne window zawierające obiekt.

    Załóżmy, że nie można stwierdzić, czy someVar jest window przez siebie, i chcesz, aby dopasować go przeciwko prawdziwy przeglądarka window przedmiot jak someVar === window, jak masz window że jesteś pewien, że to jest przeglądarka window i nie jakiś inny obiekt z zewnętrznego zakresu o nazwie window lub inny obiekt globalny z innego środowiska?

Wystarczy, aby wyjaśnić nieco więcej:

  • Nie szukam dla globalnego środowiska. Szukam konkretnie obiektu przeglądarki window.
  • Nie sprawdzam, czy skrypt działa w przeglądarce.

Nie mogę zrobić czegoś takiego jak if(!window) od window może być tylko innym obiektem zadeklarowanym gdzieś poza zakresem.

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

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

Nie mogę sprawdzić if(window.window === window) ponieważ mogę również zrobić samo odniesienie, i jak powiedziałem wcześniej, window mógłby być obiektem z zakresu zewnętrznej:

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

I dodaje nie może działać, ponieważ skrypt może być zawijany lub łączony w coś innego niż przestrzeń globalna. this można również zmodyfikować za pomocą wywołań takich jak call(), lub bind().

//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({}); 

Mam wrażenie, że jest to duplikat, ale nie mogę znaleźć, gdzie po raz pierwszy zobaczyłem go.

+0

możliwe duplikat [Jak sprawdzić, czy skrypt działa pod węzłem node.js?] (Http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –

+0

Wygląda na to, że chcesz d ustal, czy kod działa w przeglądarce, czy też nie, sprawdzając, czy istnieje okno. Możesz spróbować wyszukać funkcje, które przeglądarka może zaimplementować jako część okna, takie jak window.location.href, ale oczywiście to nie jest bezpieczne. W jaki sposób określić, czy można zwrócić prawidłowy ciąg znaków userAgent? – series0ne

+0

Czy '(function() {return this}). Call (null)' zawsze działa? –

Odpowiedz

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

       

+0

"skrypt może być zawinięty w coś innego niż przestrzeń globalna" –

+0

, a następnie zapisać odniesienie do 'this' na górze pliku. Jezus. –

+0

"Skrypt" odnosi się do całego pliku, zakładam. Nie musisz być niegrzeczny. –

3

można uzyskać globalny obiekt tak jak ...

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

Czy jest to możliwe bez 'eval' (lub' nowej funkcji')? –

+0

@JanDvorak: Jestem prawie pewien, że tak nie jest. –

+1

Nie mogę dostać części z '1' char. Właściwie uruchamiamy 'eval' na' "tym" 'ciągu znaków. W jaki sposób zaangażowane jest tutaj "1"? – Tommi

1

Jak o

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

oprócz tego, że powinieneś sprawdzić, czy '_test' nie jest już obecny w' oknie', a jeśli tak, przetestuj z inną wartością. –

+0

Nie zapomnij także cofnąć testu po zakończeniu ;-) –

+0

@JanDvorak: tak, ale jeśli NIE ma okna - jak mogę wycofać? – georg

2

To nie tylko testowym dla bieżącego okna, ale za oknem w ogóle:

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

Można to sprawdzić w przypadku korzystania niektóre metody obsługiwane tylko przez okno obiektu. Na przykład postMessage:

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

Znalazłem go podczas zrozumienia Tworzenie instancji za pośrednictwem

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) 

Chciałem stworzyć błąd jak

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

Kiedy ktoś próbuje zadzwonić MyExampleInstance nie jako przykład ale jako prosta funkcja taka jak:

MyExampleInstance(); // console should show "Please use "new" keyword 

więc końcowy wynik był następujący:

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

Aby sprawdzić obiekt jest obiektem jakiegoś „rodzaj” najbardziej prosty sposób znalazłem przez

// 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

Powiązane problemy