Javascript проверяет, является ли переменная окном - PullRequest
11 голосов
/ 23 июня 2010

знаете ли вы хороший способ проверить, является ли переменная оконным объектом в javascript? Я пробовал с:

var variable=window;
Object.prototype.toString.call(variable);

В Firefox он возвращает "[object Window]", но в IE "[object Object]", так что это неправильный путь. Вы знаете точный способ проверить это?

Ответы [ 10 ]

12 голосов
/ 23 июня 2010

Да, но мне нужен способ проверить каждое окно, а не только текущее

Есть несколько способов сделать это. Самый простой способ - проверить одно или два известных свойства объекта окна. Также есть свойство self - для каждого окна вы можете проверить, что свойство self равно объекту окна:

myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;
4 голосов
/ 26 марта 2014

Нашел это в исходном коде AngularJS.Один лайнер и удар по цели.

return variable && variable.document && variable.location && variable.alert && variable.setInterval;
2 голосов
/ 26 марта 2014
var x = new Window();
x instanceof Window
var y = []
y instanceof Window
1 голос
/ 23 февраля 2012

После использования множества опций, я считаю, что это самый точный метод определения, является ли объект кросс-браузерным окном:

(function () {
    "use strict";
    var wStr;
    wStr = Object.prototype.toString.call(window);
    function isWindow(arg) {
        var e,
            str,
            self,
            hasSelf;
        //Safari returns DOMWindow
        //Chrome returns global
        //Firefox, Opera & IE9 return Window
        str = Object.prototype.toString.call(arg);
        switch (wStr) {
        case '[object DOMWindow]':
        case '[object Window]':
        case '[object global]':
            return str === wStr;
        }
        ///window objects always have a `self` property;
        ///however, `arg.self == arg` could be fooled by:
        ///var o = {};
        ///o.self = o;
        if ('self' in arg) {
            //`'self' in arg` is true if
            //the property exists on the object _or_ the prototype
            //`arg.hasOwnProperty('self')` is true only if
            //the property exists on the object
            hasSelf = arg.hasOwnProperty('self');
            try {
                if (hasSelf) {
                    self = arg.self;
                }
                delete arg.self;
                if (hasSelf) {
                    arg.self = self;
                }
            } catch (e) {
                //IE 7&8 throw an error when window.self is deleted
                return true;
            }
        }
        return false;
    }
}());

Мне нужно будет провести более тщательное юнит-тестирование, поэтому , пожалуйста, , дайте мне знать о любых возникающих несоответствиях.

1 голос
/ 23 июня 2010

Как насчет просто:

isWindow = variable === window;

Тройное равенство предотвращает приведение типов, что в противном случае усложнило бы это.

0 голосов
/ 09 августа 2018
  1. Объект window имеет свойство, которое указывает на себя. Так что вы можете использовать, window.window == window.
  2. this всегда содержит текущий контекст. Вы можете использовать, this == window.
  3. В случае, если присутствует несколько frame s, каждый кадр содержит свой собственный объект window. Чтобы проверить глобальный window объект, вы можете использовать window.parent == window

console.log("1 : " + (window.window == window))
console.log("2 : " + (window.window == this))
console.log("3 : " + (window.parent == window))
0 голосов
/ 14 января 2018
let isWindowObj = (anObject instanceof Window);
0 голосов
/ 23 июня 2010

Поскольку window является глобальной переменной, а глобальные переменные являются свойствами глобального объекта, window.window будет равно window. Чтобы вы могли проверить:

if (mysteryVariable.window == mysteryVariable)
    ...

Проблема в том, что это можно обмануть, если у нас есть такой объект:

var q = {};
q.window = q;

Если это маловероятно, то вы можете использовать этот код.

0 голосов
/ 23 июня 2010
if(variable == window)

Это, конечно, только проверяет, является ли объект переменной этим окном (то есть окном документа, выполняющего JavaScript).

В качестве альтернативы, вы можете попробовать что-то вроде этого:*

И проверьте наличие нескольких оконных полей и / или функций, чтобы вы были вполне уверены , что это окно ...

0 голосов
/ 23 июня 2010
variable == window

Кто-то может определить локальную переменную с именем window. Я не уверен, что есть способ, который является устойчивым ко всем таким махинациям. Кто-то может создать объект, который скопировал большинство свойств и функций окна, включая toString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...