调用本机浏览器功能,即使它已被覆盖

时间:2012-08-04 05:28:34

标签: javascript

如果我有类似

的话
alert = 0;

在另一个剧本中。

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

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

2 个答案:

答案 0 :(得分:15)

在覆盖原始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,我认为它应该适用于其他浏览器。

答案 1 :(得分:5)

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

alert = 0;

var win = window.open(),
    method = win.alert;
win.close();

method.call(window, "my message");

Fiddle here.基本上,您创建一个新窗口实例并窃取其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");