JavaScript:覆盖警报()

时间:2009-11-13 14:22:31

标签: javascript override

有没有人有过在JavaScript中覆盖alert()函数的经验?

  • 哪些浏览器支持此功能?
  • 哪个浏览器版本支持此功能?
  • 覆盖这个功能的危险是什么?

12 个答案:

答案 0 :(得分:205)

绝对是“支持”的。这是您的网页,您可以随心所欲地使用它。

我已经这样做了,无需修改库就可以跟踪分析事件,但可以潜入事件。

使用代理模式:

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

如果需要(代理)

,您也可以绕过对原始功能的调用

此处有更多信息:JQuery Types #Proxy Pattern

答案 1 :(得分:23)

虽然大多数浏览器支持覆盖它,但要小心你正在使用它。

由于默认警报框阻止了执行线程,因此依赖此行为的某些库可能不再起作用(充其量)。

你应该是一个好公民,避免接触原生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);

答案 2 :(得分:15)

覆盖警报功能没有危险。每个浏览器都支持它。

例如:

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

alert('This is an override.');

答案 3 :(得分:13)

我认为每个Javascript实现都会支持这一点,并且没有任何危险。通常用普通的OS风格的警报框替换为HTML / CSS更优雅的东西。这样做意味着您不必更改现有代码!这可能使Javascript变得非常棒。

答案 4 :(得分:12)

正如许多其他答案所述,您只需使用

覆盖该功能即可
window.alert = null

window.alert = function(){}

但是,这不一定会覆盖Window构造函数原型上的函数(注意大写W),所以黑客仍然可以输入:

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

因此,您还需要使用以下方法覆盖该函数:

Window.prototype.alert = null

Window.prototype.alert = function(){}

答案 5 :(得分:7)

拉​​吉斯拉夫。
对于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);

答案 6 :(得分:4)

我覆盖alert()函数的经验是我们曾经用它来“破解”显示“请注册!”的JavaScript库试用版。唠叨屏幕通过警报时间。

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

仅用于测试目的,我们稍后购买完整版,所以没有不道德的事情发生在这里; - )

答案 7 :(得分:3)

现代浏览器中的所有JavaScript实现都支持覆盖。

危险很简单,你可以通过覆盖一些众所周知的函数(例如alert())来驱使其他团队成员绝对疯狂。

因此,除非您将功能作为一种工具重写,以某种方式调试或破解现有代码,否则我认为没有任何理由这样做。只需创建一个新功能。

答案 8 :(得分:2)

它肯定适用于firefox和ie8。我看不出有任何浏览器无法使用。这是javascript工作原理的基础,即使人们不经常看到它与原生函数一起使用=)

答案 9 :(得分:1)

我要做的快速黑客来找到警报的来源,就是去控制台再输入

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

答案 10 :(得分:0)

我已经要求同时显示默认消息和实际警报消息。这就是我设法做到的方式。


    const actualAlertFunc = window.alert;
    window.alert = function(msg) {
         actualAlertFunc('some default message '+ msg);
    }

我已经在chrome上对其进行了测试。 我不确定它是否是一种很好的做法,但是它可以达到目的。

答案 11 :(得分:-1)

对于js浏览器功能window.alert是卓越且最知名的,不知道js的人知道alert() - 请放心,所有浏览器都支持今天使用,你的代码片段也是如此。但是,我不会覆盖(这更像是重构而不是在OOP意义上覆盖)alert()用于特定用例,因为当你实际需要使用alert()而没有模板时,你可能会,然后你需要另一个非警报功能。