调用本机浏览器函数,即使它已被覆盖

Call native browser function, even after it has been overridden

本文关键字:覆盖 本机 浏览器 函数 调用      更新时间:2023-09-26

如果我有类似的东西

alert = 0;

在另一个脚本中。

这是在另一个脚本中,我的代码无法在该脚本之前加载。

如何调用脚本中的原始alert方法?

覆盖原始alert之前,请保存它。

var origAlert = alert;
alert = 0;
origAlert("foo");

演示:http://jsfiddle.net/jfriend00/tnNE7/


如果不能保存原始值,我所知道的访问它的唯一其他方法就是在iframe中。这里有一个例子:

alert = 0;
var iframe = document.createElement("iframe");
iframe.height = 0;
iframe.width = 0;
document.body.appendChild(iframe);
iframe.contentWindow.alert.call(window, "foo");​

工作示例:http://jsfiddle.net/jfriend00/waMEV/

我并没有在所有浏览器中都尝试过,但它在Chrome、IE和Firefox中都能工作,我认为它应该在其他浏览器中工作。

好吧,我是第一个承认这是一个丑陋的答案,但它似乎有效:

alert = 0;
var win = window.open(),
    method = win.alert;
win.close();
method.call(window, "my message");

在这里打闹。本质上,您可以创建一个新的窗口实例并窃取其alert方法。不利的一面是,你实际上必须打开一个新的浏览器窗口,尽管时间很短。我怀疑这是否真的是解决你问题的实用方案——这取决于你试图使用的其他网站,以及你有多关心最终用户对你的解决方案的看法。

编辑:这是上面的答案和jfriend00的答案的组合,解决了"打开新窗口"的问题。我认为这是一个更好的选择,因为a)当你需要调用方法时,它不依赖于iframe仍然在DOM中,b)它应该可以推广到任何window方法,而jfriend00的答案可能不是。

alert = 0;
// make a new window instance in an iframe
var iframe = document.createElement("iframe");
iframe.height = iframe.width = 0;
document.body.appendChild(iframe);
// steal the method
var method = iframe.contentWindow.alert;
// remove the evidence
document.body.removeChild(iframe);
// now use the method for your own purposes
function myAlert(message) {
    method.call(window, message);
}
myAlert("foo");