对于我正在编写的脚本,我想使用本机 window.open 方法。然而,一个我无权访问的已加载脚本会用布尔值覆盖全局 window.open 方法(哎呀)。
我知道如何恢复文档上的方法(通过 HTMLDocument.prototype),但我不知道如何在窗口上恢复它们,因为我似乎找不到与窗口等效的方法。例如,Window.prototype.open 不存在。
我尝试创建一个 iframe,并从 iframe 中的 contentWindow 获取 open 方法,但浏览器将阻止使用打开窗口,open因为它可能是在另一个源中创建的。两者都delete open;不起作用,因为是在全局加载的脚本中open使用定义的。var
那么,如何恢复openChrome 中定义为“本机代码”的方法呢?
我知道周围也有类似的问题,但实际上主要问题是:
Window 对象是否有相当于 HTMLDocument 的对象?
我发现了这个问题,并且接受的答案(使用 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)
保留解决方法的答案,以防有人需要:
您可以在执行重新定义 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)
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |