无法将函数注入本机窗口

时间:2017-07-18 13:44:37

标签: javascript visual-studio visual-studio-2015

我正在尝试将getStatus函数注入window。具体来说,我想将它贴在window.open返回的窗口上:

window.open = function (open) {
    return function (url, name, opts) {
        var windowObj = open.call(window, url, name, opts);

        windowObj.getStatus = function () {
            return 1;
        };

        return windowObj;
    };
}(window.open)

我的代码中的其他地方,我这样做:

var myWindow = window.open("...", "...", "...");
var a = myWindow.getStatus();

有时当我从Visual Studio 2015调试时,我可以成功调用该函数,有时我不能并且崩溃:

  

0x800a01b6 - JavaScript运行时错误:对象不支持属性或方法'getStatus'

有没有人遇到过这样的问题?感觉像是时间问题。可能是调试器的一个问题。

1 个答案:

答案 0 :(得分:0)

  

有没有人遇到过这样的问题?

没有。我在Visual Studio 2013 Express版中进行了多次调试并且没有崩溃。我能够毫无问题地进行调试。

注意:对于问题的简化版本,以下响应可能听起来不合时宜。

坦率地说,我从未尝试覆盖窗口的默认行为。但是看看你的尝试,尝试它是非常诱人的。 :)

所以我在这里试了一下:https://jsfiddle.net/vnathalye/4hhrb255/

至少alert(1)一直在执行。我还修改了它以调用本机addEventListener,它似乎也适用于以下条件:

  1. 我使用click事件代替closebeforeunload也有效。
  2. 我使用“about:blank”作为网址。
  3. AFAIK,如果您在子窗口中打开另一个页面,则无法在父窗口中处理它的JS事件。您需要在子窗口中打开的页面中处理适当的JS事件,并且需要将这些信息传递给window.opener

    关于close事件,我从未使用它(或者甚至没有使用过它:|)。相反,unload / beforeunload是通常使用的两个事件。