对于我正在编写的脚本,我想使用本机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?
答案 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);
在有人需要的情况下保持变通方法的答案:
您可以在执行重新定义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);
}