恢复原生Window方法

San*_*der 4 javascript

对于我正在编写的脚本,我想使用本机 window.open 方法。然而,一个我无权访问的已加载脚本会用布尔值覆盖全局 window.open 方法(哎呀)。

我知道如何恢复文档上的方法(通过 HTMLDocument.prototype),但我不知道如何在窗口上恢复它们​​,因为我似乎找不到与窗口等效的方法。例如,Window.prototype.open 不存在。

我尝试创建一个 iframe,并从 iframe 中的 contentWindow 获取 open 方法,但浏览器将阻止使用打开窗口,open因为它可能是在另一个源中创建的。两者都delete open;不起作用,因为是在全局加载的脚本中open使用定义的。var

那么,如何恢复openChrome 中定义为“本机代码”的方法呢?

我知道周围也有类似的问题,但实际上主要问题是:

Window 对象是否有相当于 HTMLDocument 的对象?

Gui*_*ges 5

我发现了这个问题,并且接受的答案(使用 iframe)可以用于您的情况。

唯一的问题是,只要 iframe 仍在文档中,您就只能使用检索到的 window.open 版本。

function customOpen() {
    // local variables definitions : 
    var url = "https://stackoverflow.com", iframe, _window;

    // creating an iframe and getting its version of window.open : 
    iframe = document.createElement("iframe");
    document.documentElement.appendChild(iframe);
    _window = iframe.contentWindow;

    // storing it in our window object
    window.nativeOpen = _window.open;   

    try {
        window.open(url);
    } catch (e) {
        console.warn(e); // checking that window.open is still broken 
    }
    window.nativeOpen(url);

    // deleting the iframe : 
    document.documentElement.removeChild(iframe);
}

document.getElementById("button").addEventListener("click", customOpen);
Run Code Online (Sandbox Code Playgroud)

另一个 JSFiddle


保留解决方法的答案,以防有人需要:

您可以在执行重新定义 window.open 的脚本之前执行自定义脚本吗?如果是这样,您可以在另一个全局变量中创建 window.open 的副本。

它可能看起来像这样:

1.首先:备份脚本

window.nativeOpen = window.open;
Run Code Online (Sandbox Code Playgroud)

2. 然后,无论 window.open 覆盖脚本做什么:

window.open = false; // who does that, seriously?
Run Code Online (Sandbox Code Playgroud)

3.您的窗口打开脚本,将使用您的 window.open 副本:

function customOpen() {
    var url = "https://stackoverflow.com";
    try {
        window.open(url);
    } catch (e) {
        console.warn(e);
    }
    window.nativeOpen(url);
}
Run Code Online (Sandbox Code Playgroud)

JSFiddle 示例