有人曾尝试过覆盖 JavaScript 中的 alert()
函数吗?
- 哪些浏览器支持此功能?
- 哪些浏览器版本支持此功能?
- 覆盖该函数存在哪些危险性?
有人曾尝试过覆盖 JavaScript 中的 alert()
函数吗?
它绝对是“支持的”。这是你的网页,你可以随心所欲地处理。
我已经使用事件拦截技术来跟踪分析数据,而无需修改库文件。
使用代理模式:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
你也可以绕过对原始函数的调用,如果你想要代理它。window.alert
不支持apply()
。 - cllpseapply
是Function
对象的一个方法。所以他们必须明确地将其限制为alert
?! - Mike Gleason jr Couturier虽然大多数浏览器支持重写alert函数,但你需要小心使用。
因为默认的提示框会阻塞执行线程,一些依赖此行为的库可能无法正常工作(充其量)。
你应该做一个好公民并避免接触原生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);
覆盖警报函数没有任何隐患。每个浏览器都支持它。
例如:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
alert("Reloading")
并重新加载网页的代码。用户可能永远看不到警告文本。 - Darien正如其他答案中所说,您可以通过覆盖该函数来实现
window.alert = null
或者
window.alert = function(){}
然而,这并不一定会覆盖Window
构造函数原型上的函数(注意大写的 W
),所以黑客仍然可以输入:
然而,这并不一定会覆盖Window
构造函数原型上的函数(注意大写的 W
),所以黑客仍然可以输入:
Window.prototype.alert.apply(window, ["You were hacked!"]);
因此,您还需要使用以下内容覆盖该函数:
Window.prototype.alert = null
或者Window.prototype.alert = function(){}
我认为每个JavaScript实现都会支持这个功能,而且它没有任何危险性。通常使用HTML/CSS来替换操作系统原始的提示框,从而达到更加优雅的效果。以这种方式实现意味着您不必更改现有代码!这个功能的存在使JavaScript变得很棒。
您好。针对IE8,您可以通过以下方式重新定义alert()函数:
/**
* Definition of global attached to window properties <br/>
*/
(function() {
nalert = window.alert;
Type = {
native: 'native',
custom: 'custom'
};
})();
/**
* Factory method for calling alert().
* It will be call a native alert() or a custom redefined alert() by a Type param.
* This defeinition need for IE
*/
(function(proxy) {
proxy.alert = function () {
var message = (!arguments[0]) ? 'null': arguments[0];
var type = (!arguments[1]) ? '': arguments[1];
if(type && type == 'native') {
nalert(message);
}
else {
document.write('<h1>I am redefiend alert()<br/>Alert say: '+message+'</h1>');
}
};
})(this);
alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);
现代浏览器中的所有JavaScript实现都支持覆盖。
危险很简单,如果你覆盖常用函数(如alert()),会让其他团队成员非常疯狂。
因此,除非你是将覆盖函数作为调试或以某种方式修改现有代码的工具,否则我不认为有任何理由这样做。只需创建一个新函数。
我的经验是,我们曾经使用覆盖alert()函数的方法来“黑客”试用版JavaScript库。该库会不时地通过弹出框显示“请注册!”。
我们只需定义自己的alert()函数,就可以轻松解决了。
这只是为了测试目的,后来我们购买了完整版本,所以没有任何不道德行为;-)
我曾经面临一个需求,需要在实际警告消息的同时显示一个默认消息。这是我处理它的方法。
const actualAlertFunc = window.alert;
window.alert = function(msg) {
actualAlertFunc('some default message '+ msg);
}
我已经在Chrome上测试过了。我不确定它是否是一个好的实践,但它达到了目的。
在Firefox和IE8中,它肯定有效。我认为它适用于任何浏览器。这基本上是JavaScript的基础,尽管我们不经常看到它与原生函数一起使用。
_alert
作为第一个实例中一种 expando 的临时方式来交换函数体。 - non sequitor