有人有在JavaScript中重写alert()函数的经验吗?
哪些浏览器支持这个功能? 哪些浏览器版本支持此功能? 重写函数的危险是什么?
有人有在JavaScript中重写alert()函数的经验吗?
哪些浏览器支持这个功能? 哪些浏览器版本支持此功能? 重写函数的危险是什么?
当前回答
它绝对是“支持的”。这是你的网页,你想做什么就做什么。
我已经这样做了,在不修改库的情况下跟踪分析事件,但通过潜入事件。
使用代理模式:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
如果需要,还可以绕过对原始函数的调用(代理)
更多信息:JQuery类型#代理模式
其他回答
正如在许多其他答案中所述,您可以使用
window.alert = null
or
window.alert = function(){}
然而,这并不一定会覆盖Window构造函数原型上的函数(注意大写的W),所以黑客仍然可以输入:
Window.prototype.alert.apply(window, ["You were hacked!"]);
因此,你还需要重写该函数:
Window.prototype.alert = null
or
Window.prototype.alert = function(){}
它在firefox和ie8中确实有效。我看不出有什么浏览器是它不能运行的。这是javascript工作的基本原理,尽管人们不经常看到它与原生函数一起使用=)
尽管大多数浏览器支持重写它,但要小心使用它所做的事情。
由于默认的警告框阻塞了执行线程,一些依赖此行为的库可能不再工作(充其量)。
您应该做一个好公民,避免接触本机API。如果你这样做了,当你使用第三方代码时,你可以把事情分开。
然而,如果你想在特定的上下文中重新定义警报行为,你可以用一个匿名函数来包围它,就像这样:
/* new funky alert */
function myFunkyAlert(msg) {
/* here goes your funky alert implementation */
alert("Look ma!\n" + msg);
}
(function(alert) { // anonymous function redefining the "alert"
/* sample code */
alert("Hello World!");
})(myFunkyAlert);
我认为每个Javascript实现都将支持这一点,并且这样做不会有任何危险。通常用HTML/CSS代替简单的os风格的警告框。这样做意味着您不必更改现有的代码!这一事实使得Javascript非常棒。
现代浏览器中的所有JavaScript实现都支持重写。
危险很简单,如果您重写了诸如alert()这样的常见函数,就会把其他团队成员逼疯。
所以除非你重写函数作为调试或修改现有代码的工具,否则我认为没有任何理由这样做。只需要创建一个新函数。