JavaScript: override alert()

有人有在JavaScript中重写alert()函数的经验吗?

  • 哪些浏览器支持这个功能?
  • 哪些浏览器版本支持此功能?
  • 重写函数的危险是什么?
102430 次浏览

它在firefox和ie8中确实有效。我看不出有什么浏览器是它不能运行的。这是javascript工作的基本原理,尽管人们不经常看到它与原生函数一起使用=)

我认为每个Javascript实现都将支持这一点,并且这样做不会有任何危险。通常用HTML/CSS代替简单的os风格的警告框。这样做意味着您不必更改现有的代码!这一事实使得Javascript非常棒。

现代浏览器中的所有JavaScript实现都支持重写。

危险很简单,如果您重写了诸如alert()这样的常见函数,就会把其他团队成员逼疯。

所以除非你重写函数作为调试或修改现有代码的工具,否则我认为没有任何理由这样做。只需要创建一个新函数。

说到js的浏览器函数,window.alert是最杰出和最著名的,不了解js的人知道alert()——请放心,所有浏览器今天仍在使用都支持它,你的代码片段也是如此。然而,我不会覆盖(好吧,这更像是重构,而不是覆盖OOP意义上的)alert()为你的特定用例,因为当你实际上需要使用alert()没有模板,你可能会这样做,那么你将需要另一个非警报函数来这样做。

它绝对是“支持的”。这是你的网页,你想做什么就做什么。

我已经这样做了,在不修改库的情况下跟踪分析事件,但通过潜入事件。

使用代理模式:

(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);

如果需要,还可以绕过对原始函数的调用(代理)

更多信息:JQuery类型#代理模式

我重写alert()函数的经验是,我们曾经使用它来“破解”JavaScript库的试用版,该库在每次提醒时都显示“请注册!”的提示屏幕。

我们刚刚定义了自己的alert()函数,瞧。

这只是为了测试,我们后来买了完整版,所以这里没有什么不道德的事情;-)

超铃报警功能无危险。每个浏览器都支持它。

例如:

// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}


alert('This is an override.');

尽管大多数浏览器支持重写它,但要小心使用它所做的事情。

由于默认的警告框阻塞了执行线程,一些依赖此行为的库可能不再工作(充其量)。

您应该做一个好公民,避免接触本机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);
< p > Ladislav。
对于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);

并调用as

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);

正如在许多其他答案中所述,您可以使用

window.alert = null

window.alert = function(){}

然而,这并不一定会覆盖Window构造函数原型上的函数(注意大写W),因此黑客仍然可以键入:

Window.prototype.alert.apply(window, ["You were hacked!"]);

因此,你还需要重写该函数:

Window.prototype.alert = null

Window.prototype.alert = function(){}

我做的一个快速破解来找到警报来自哪里,是去控制台,然后输入这个

function alert(message) {
console.info(message);
debugger;
}

我遇到过一个要求,即在显示实际警报消息的同时显示默认消息。这就是我如何做到的。


const actualAlertFunc = window.alert;
window.alert = function(msg) {
actualAlertFunc('some default message '+ msg);
}
我已经在chrome上测试过了。 我不确定这是否是一种好的做法,但它达到了目的