Javascript检查变量是否为窗口

时间:2010-06-23 07:29:03

标签: javascript cross-browser

你知道检查变量是否是javascript中的窗口对象的好方法吗? 我尝试过:

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

在Firefox中,它返回"[object Window]",但在IE "[object Object]"中,这是不正确的方式。你知道一个准确的检查方法吗?

10 个答案:

答案 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)

  1. window对象具有指向自身的属性。因此您可以使用window.window == window
  2. this始终保留当前上下文。您可以使用this == window
  3. 如果存在多个frame,则每个帧都包含其自己的window对象。要检查全局window对象,可以使用window.parent == window

console.log("1 : " + (window.window == window))
console.log("2 : " + (window.window == this))
console.log("3 : " + (window.parent == window))