有没有人有过重写alert()
JavaScript函数的经验?
- 哪些浏览器支持此功能?
- 哪些浏览器版本支持此功能?
- 覆盖该功能有哪些危险?
_alert
有没有人有过重写alert()
JavaScript函数的经验?
_alert
Answers:
绝对是“受支持的”。这是您的网页,您可以使用它进行任何操作。
我已经这样做了,无需修改库而是通过潜入事件来跟踪分析事件。
使用代理模式:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
如果需要,也可以绕过对原始函数的调用(代理)
更多信息在这里:jQuery类型#Proxy模式
apply()
不可用window.alert
apply
是该Function
对象的方法。因此,他们必须明确地将其限制为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);
正如在其他许多答案中所说的那样,您可以使用
window.alert = null
要么
window.alert = function(){}
但是,这不一定会覆盖Window
构造函数原型上的函数(请注意大写字母W
),因此黑客仍然可以键入:
Window.prototype.alert.apply(window, ["You were hacked!"]);
因此,您还需要使用以下方法覆盖该功能:
Window.prototype.alert = null
要么
Window.prototype.alert = function(){}
拉迪斯拉夫。
对于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);
我对覆盖alert()函数的经验是,我们曾经使用它来“破解”显示“请注册!”的JavaScript库的试用版。时不时提醒屏幕。
我们只是定义了自己的alert()函数和瞧。
这只是出于测试目的,我们稍后购买了完整版,因此这里没有不道德的事情;-)
它肯定可以在Firefox和ie8中工作。我看不到有任何浏览器无法使用。这是javascript工作原理的基本原理,即使人们并不经常看到它与诸如那==的本机函数一起使用
我要查找警报的来源的一个快速技巧是进入控制台,然后输入
function alert(message) {
console.info(message);
debugger;
}