你知道检查变量是否是javascript中的窗口对象的好方法吗? 我尝试过:
var variable=window;
Object.prototype.toString.call(variable);
在Firefox中,它返回"[object Window]"
,但在IE "[object Object]"
中,这是不正确的方式。你知道一个准确的检查方法吗?
答案 0 :(得分:12)
是的,但我需要一种方法来检查每个窗口,而不仅仅是当前的窗口
有几种方法可以做到这一点。最简单的方法是检查窗口对象上的一个或两个已知属性。还有self
属性 - 对于每个窗口,您可以检查self
属性是否等于窗口对象:
myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;
答案 1 :(得分:4)
在AngularJS源代码中找到了这个。一个衬垫和目标上的爆炸。
return variable && variable.document && variable.location && variable.alert && variable.setInterval;
答案 2 :(得分:2)
var x = new Window();
x instanceof Window
var y = []
y instanceof Window
答案 3 :(得分:1)
如何:
isWindow = variable === window;
三等于防止类型强制,否则会使这更难做。
答案 4 :(得分:1)
在使用了许多选项后,我相信这是检测对象是否是跨浏览器窗口的最准确方法:
(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;
}
}());
我需要执行更严格的单元测试,因此 让我知道出现的任何不一致。
答案 5 :(得分:0)
variable == window
有人仍然可以定义一个名为window
的局部变量。我不确定是否有一种适应所有这类恶作剧的方法。有人可以创建一个复制大多数窗口属性和函数的对象,包括toString
。
答案 6 :(得分:0)
if(variable == window)
当然只检查变量对象是否是这个窗口(即执行javascript的文档窗口)。
或者,您可以尝试这样的事情:
if(variable.document && variable.location)
并检查是否存在一些窗口字段和/或函数,以便您非常确定它是一个窗口......
答案 7 :(得分:-1)
由于window
是全局变量而全局变量是全局对象的属性,因此window.window
将等于window
。所以你可以测试一下:
if (mysteryVariable.window == mysteryVariable)
...
问题是,如果我们有这样的对象,这可能会被愚弄:
var q = {};
q.window = q;
如果不太可能,那么您可以使用此代码。
答案 8 :(得分:-1)
let isWindowObj = (anObject instanceof Window);
答案 9 :(得分:-1)
window
对象具有指向自身的属性。因此您可以使用window.window == window
。this
始终保留当前上下文。您可以使用this == window
。frame
,则每个帧都包含其自己的window
对象。要检查全局window
对象,可以使用window.parent == window
console.log("1 : " + (window.window == window))
console.log("2 : " + (window.window == this))
console.log("3 : " + (window.parent == window))