Проверка Javascript, если переменная является окном
Знаете ли вы, что хороший способ проверить, является ли переменная объектом окна в javascript?
Я пробовал:
var variable=window;
Object.prototype.toString.call(variable);
В Firefox он возвращает "[object Window]"
, но в IE "[object Object]"
, так что это не правильный путь. Вы знаете точный способ проверить это?
Ответы
Ответ 1
Да, но мне нужен способ проверить каждое окно не только на текущий
Есть несколько способов сделать это. Самый простой способ - проверить наличие одного или двух известных свойств объекта окна. Также свойство self
- для каждого окна можно проверить, что свойство self
равно объекту окна:
myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;
Ответ 2
Обнаружено это в исходном коде AngularJS. Один лайнер и удар по цели.
return variable && variable.document && variable.location && variable.alert && variable.setInterval;
Ответ 3
Как насчет просто:
isWindow = variable === window;
Тройной эквивалент предотвращает принуждение типа, которое в противном случае сделало бы это намного сложнее.
Ответ 4
После многопользовательской работы, я считаю, что это самый точный метод определения того, является ли объект кросс-браузером:
(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;
}
}());
Мне нужно будет выполнить более строгий unit тест, поэтому пожалуйста сообщите мне о любых несоответствиях, которые возникают.
Ответ 5
variable == window
Кто-то все еще может определить локальную переменную с именем window
. Я не уверен, что есть способ, который был бы устойчив ко всем таким махинациям. Кто-то может сделать объект, который скопировал большую часть свойств и функций окна, включая toString
.
Ответ 6
if(variable == window)
Это, конечно, проверяет, является ли объект переменной этим окном (т.е. окно документа, выполняющего javascript).
В качестве альтернативы вы можете попробовать что-то вроде этого:
if(variable.document && variable.location)
И проверьте наличие нескольких оконных полей и/или функций, чтобы вы были уверены, что это окно...
Ответ 7
Так как window
- глобальная переменная, а глобальные переменные - свойства глобального объекта, window.window
будет равно window
. Итак, вы можете проверить:
if (mysteryVariable.window == mysteryVariable)
...
Проблема в том, что это можно обмануть, если у нас есть такой объект:
var q = {};
q.window = q;
Если это не так, вы можете использовать этот код.
Ответ 8
var x = new Window();
x instanceof Window
var y = []
y instanceof Window
Ответ 9
let isWindowObj = (anObject instanceof Window);