代码之家  ›  专栏  ›  技术社区  ›  mck89

javascript检查变量是否是窗口

  •  11
  • mck89  · 技术社区  · 14 年前

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

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

    在Firefox中,它会返回 "[object Window]" 但在伊江 "[object Object]" 所以这不是正确的方法。你知道一种精确的检查方法吗?

    10 回复  |  直到 6 年前
        1
  •  12
  •   Andy E    14 年前

    是的,但我需要一种方法来检查每个窗口,不仅是当前窗口

    有几种方法可以做到这一点。最简单的方法是检查窗口对象上的一个或两个已知属性。还有 self 属性-对于每个窗口,可以检查 自己 属性等于窗口对象:

    myvar.self == myvar;
    window.self == window;
    frameElement.contentWindow.self == frameElement.contentWindow;
    
        2
  •  4
  •   RAJCHOW    10 年前

    在AngularJS源代码中找到了这个。一条直线击中目标。

    return variable && variable.document && variable.location && variable.alert && variable.setInterval;
    
        3
  •  2
  •   Peter Parker    10 年前
    var x = new Window();
    x instanceof Window
    var y = []
    y instanceof Window
    
        4
  •  1
  •   Andrew    14 年前

    只是:

    isWindow = variable === window;
    

    三等号可以防止类型强制,否则会使这变得更难做到。

        5
  •  1
  •   zzzzBov    12 年前

    在玩弄了许多选项之后,我认为这是检测对象是否为窗口交叉浏览器的最准确方法:

    (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;
        }
    }());
    

    我需要执行一些更严格的单元测试,所以 拜托 如果出现任何不一致,请通知我。

        6
  •  0
  •   Janick Bernet    14 年前
    if(variable == window)
    

    当然,这只检查变量对象是否是这个窗口(即执行javascript的文档的窗口)。

    或者,您可以尝试如下操作:

    if(variable.document && variable.location)
    

    检查是否存在一些窗口字段和/或函数 相当肯定 它是一扇窗户…

        7
  •  0
  •   Matthew Flaschen    14 年前
    variable == window
    

    有人仍然可以定义一个名为 window . 我不确定有没有一种方法能抵抗所有这些恶作剧。有人可以创建一个复制了大多数窗口属性和函数的对象,包括 toString .

        8
  •  -1
  •   Casey Chu    14 年前

    自从 window 是全局变量,全局变量是全局对象的属性, window.window 意志平等 窗口 . 所以你可以测试:

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

    问题是,如果我们有这样一个物体,这是可以被愚弄的:

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

    如果不太可能,那么可以使用此代码。

        9
  •  -1
  •   Itay Merchav    6 年前
    let isWindowObj = (anObject instanceof Window);
    
        10
  •  -1
  •   Vignesh Raja    6 年前
    1. 这个 window 对象具有指向自身的属性。所以你可以使用, window.window == window .
    2. this 始终保持当前上下文。你可以使用, this == window .
    3. 如果是多个 frame 现在,每一帧都包含自己的 窗口 对象。检查全局 窗口 对象,可以使用 window.parent == window

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