你知道检查变量是否是javascript中的窗口对象的好方法吗? 我尝试过:
var variable=window;
Object.prototype.toString.call(variable);
在Firefox中它返回 "[object Window]"
但在IE中 "[object Object]"
所以这不是正确的方法。你知道一个准确的检查方法吗?
你知道检查变量是否是javascript中的窗口对象的好方法吗? 我尝试过:
var variable=window;
Object.prototype.toString.call(variable);
在Firefox中它返回 "[object Window]"
但在IE中 "[object Object]"
所以这不是正确的方法。你知道一个准确的检查方法吗?
是的,但我需要一种方法来检查每个窗口,而不仅仅是当前窗口
有几种方法可以做到这一点。最简单的方法是检查窗口对象上的一个或两个已知属性。还有 self
属性 - 对于每个窗口,你可以查看 self
property等于window对象:
myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;
在AngularJS源代码中找到了这个。一个内衬和目标上的爆炸。
return variable && variable.document && variable.location && variable.alert && variable.setInterval;
怎么样:
isWindow = variable === window;
三等于防止类型强制,否则会使这更难做。
在使用了许多选项后,我相信这是检测对象是否是跨浏览器窗口的最准确方法:
(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;
}
}());
我需要进行更严格的单元测试,所以 请 让我知道出现的任何不一致之处。
if(variable == window)
那当然只检查变量对象是否是这个窗口(即执行javascript的文档的窗口)。
或者,您可以尝试这样的事情:
if(variable.document && variable.location)
并检查是否存在一些窗口字段和/或函数 很确定 它是一个窗口......
variable == window
有人仍然可以定义一个名为的局部变量 window
。我不确定有什么办法可以适应所有这些恶作剧。有人可以创建一个复制大多数窗口属性和功能的对象,包括 toString
。
var x = new Window();
x instanceof Window
var y = []
y instanceof Window
以来 window
是全局变量,全局变量是全局对象的属性, window.window
会平等的 window
。所以你可以测试:
if (mysteryVariable.window == mysteryVariable)
...
问题是,如果我们有这样的对象,这可能会被愚弄:
var q = {};
q.window = q;
如果那不太可能,那么您可以使用此代码。