7

如果我有类似的东西

alert = 0;

在另一个脚本中。

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

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

4

2 回答 2

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

于 2012-08-04T05:32:44.210 回答
5

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

alert = 0;

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

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

在这里拉小提琴。本质上,您创建了一个新窗口实例并窃取了它的alert方法。缺点是您实际上必须打开一个新的浏览器窗口,尽管时间很短。我怀疑这实际上是解决您的问题的实用解决方案 - 取决于您尝试使用的其他站点,以及您对解决方案对最终用户的看法的关心程度。

编辑:这是上述答案和 jfriend00 的答案的组合,它解决了“打开一个新窗口”问题。我认为这是一个更好的选择,因为a)当您需要调用该方法时,它不依赖仍在 DOM 中的 iframe,并且 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");
于 2012-08-04T06:05:07.460 回答