2012-08-04 76 views
7

即使如果我在另一个脚本像调用本地浏览器功能,它已被重写

alert = 0; 

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

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

+0

如果是有用的Javascript确认对话框可用于显示消息,如果yes/no按钮可以被忽略。 – Ekim 2012-08-04 06:04:17

回答

14

在覆盖原始的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的作​​品,我认为它应该在其他浏览器。

+0

对不起,我忘了提。我不是最重要的警报。另一个脚本是。 – Dogbert 2012-08-04 05:33:15

+0

我正在现有网站上运行此操作。我的代码总是在稍后加载:) – Dogbert 2012-08-04 05:34:42

+0

@AnkitGautam用例:我不希望网站知道我称为函数。他们可以从脚本中修改该功能,因此它的行为与旧脚本完全相同,但是在某处使用该功能的日志。 – Dogbert 2012-08-04 05:42:24

6

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

alert = 0; 

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

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

Fiddle here.从本质上讲,你犯了一个新的窗口实例并窃取其alert方法。缺点是你实际上不得不打开一个新的浏览器窗口,尽管很简单。我怀疑这实际上是对您的问题的实际解决方案 - 取决于您尝试使用的其他网站,以及您关心解决方案对最终用户的看法。

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

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"); 
+0

为什么你把'this'设置为'window'而不是'win'是'win''''''' alert? – icktoofay 2012-08-04 06:10:56

+0

我已经关闭了'win',所以它无法工作。 – nrabinowitz 2012-08-04 06:14:01

+0

如何从新创建的iframe中窃取fn?结果将是相同的,只是你不会弹出一个新窗口 – 2012-08-04 06:16:27