有没有人有过alert()
在 JavaScript 中覆盖函数的经验?
- 哪些浏览器支持这个?
- 哪些浏览器版本支持这个?
- 覆盖函数有什么危险?
有没有人有过alert()
在 JavaScript 中覆盖函数的经验?
这绝对是“支持”的。这是您的网页,您可以对它做任何想做的事情。
我已经这样做了,无需修改库,而是通过潜入事件来跟踪分析事件。
使用代理模式:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
如果需要,您还可以绕过对原始函数的调用(代理)
尽管大多数浏览器都支持覆盖它,但在使用它时要小心。
由于默认警报框会阻止执行线程,因此某些依赖此行为的库可能不再起作用(充其量)。
你应该做一个好公民,避免接触原生 API。如果这样做,则在使用 3rd 方代码时可能会破坏事情。
然而,如果您想在特定上下文中重新定义警报行为,您可以将其包含在一个匿名函数中,如下所示:
/* 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);
Overring 警报功能没有危险。每个浏览器都支持它。
例如:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
正如在许多其他答案中所说,您可以使用
window.alert = null
或者
window.alert = function(){}
然而,这并不一定会覆盖Window
构造函数原型上的函数(注意大写W
),因此黑客仍然可以输入:
Window.prototype.alert.apply(window, ["You were hacked!"]);
因此,您还需要使用以下方法覆盖该函数:
Window.prototype.alert = null
或者
Window.prototype.alert = function(){}
我认为每个 Javascript 实现都会支持这一点,并且不涉及任何危险。通常使用 HTML/CSS 将普通的 OS 样式的警告框替换为更优雅的东西。这样做意味着您不必更改现有代码!事实上,它是可能的,这让 Javascript 变得很棒。