恢复本机Window方法

时间:2017-12-28 11:20:34

标签: javascript

对于我正在编写的脚本,我想使用本机window.open方法。但是,已经加载到我无法访问的脚本会用布尔值(ouch)覆盖全局window.open方法。

我知道如何恢复Document上的方法(通过HTMLDocument.prototype),但我不知道如何在Window上恢复它们​​,因为我似乎无法找到与Window相同的方法。例如,Window.prototype.open不存在。

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

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

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

是否有与Window对象相同的HTMLDocument?

1 个答案:

答案 0 :(得分:2)

我找到了this question,并且您的案例中可以使用已接受的答案(使用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);

Another JSFiddle

在有人需要的情况下保持变通方法的答案:

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

看起来像这样:

<强> 1。第一:备份脚本

window.nativeOpen = window.open;

<强> 2。然后,无论window.open覆盖脚本如何:

window.open = false; // who does that, seriously?

第3。您的窗口打开脚本,它将使用您的window.open copy:

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

JSFiddle example