JavaScript:覆盖警报()

JavaScript:覆盖警报(),javascript,overriding,Javascript,Overriding,有没有人有过在JavaScript中重写alert()函数的经验 哪些浏览器支持此功能 哪些浏览器版本支持此功能 重写函数有哪些危险 它在firefox和ie8中确实有效。我看不出会有任何浏览器不工作。这几乎是javascript工作原理的基础,尽管人们不经常看到它与像那样的本机函数一起使用=)我认为每个javascript实现都会支持这一点,而且不会有任何危险。通常使用HTML/CSS将简单的OS样式的警报框替换为更优雅的警报框。这样做意味着您不必更改现有代码!这一事实使Javascript

有没有人有过在JavaScript中重写
alert()
函数的经验

  • 哪些浏览器支持此功能
  • 哪些浏览器版本支持此功能
  • 重写函数有哪些危险

它在firefox和ie8中确实有效。我看不出会有任何浏览器不工作。这几乎是javascript工作原理的基础,尽管人们不经常看到它与像那样的本机函数一起使用=)

我认为每个javascript实现都会支持这一点,而且不会有任何危险。通常使用HTML/CSS将简单的OS样式的警报框替换为更优雅的警报框。这样做意味着您不必更改现有代码!这一事实使Javascript变得非常棒。

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

危险很简单,您会通过重写常见的函数(如alert())将其他团队成员逼疯


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

当涉及到js浏览器函数
窗口时。alert
是最杰出的,也是最有名的,不了解js的人都知道
alert()
——请放心,它在今天使用的所有浏览器中都受支持,您的代码片段也受支持。但是,对于您的特定用例,我不会重写(这更像是重构,而不是OOP意义上的重写)
alert()
,因为当您实际需要在没有模板的情况下使用
alert()
时,您可能需要另一个非alert函数

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

我已经这样做了,跟踪分析事件而不修改库,但潜入事件

使用代理模式:

(function(proxied) {
  window.alert = function() {
    // do something here
    return proxied.apply(this, arguments);
  };
})(window.alert);
如果需要,还可以绕过对原始函数的调用(代理)


这里有更多信息:

我对重写alert()函数的经验是,我们曾经使用它“黑客”JavaScript库的试用版,该库会不时在警报屏幕上显示“请注册!”nag屏幕

我们刚刚定义了自己的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);
拉迪斯拉夫。
对于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);

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

window.alert = null

但是,这并不一定覆盖
窗口
构造函数原型上的函数(注意大写字母
W
),因此黑客仍然可以键入:

Window.prototype.alert.apply(window, ["You were hacked!"]);
因此,您还需要使用以下命令覆盖该函数:

Window.prototype.alert = null


我所做的一个快速破解是找到警报来自何处,即转到控制台,然后输入此消息

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

我面临一个要求,即在显示实际警报消息的同时显示一条默认消息。我就是这样做到的


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

专门针对IE6的浏览器,其他人可能会同意。这不是一个无限循环吗?@Nick-不,不是。“正常”window.alert功能将分配给window.\u alert.>在<之后,window.alert函数被重新定义。@roosteronacid:您的代码在语义和语法上都很好,尽管是人为的,正如@paper1337所指出的那样…这里没有递归的机会lol…本质上,您只是在第一个实例中将函数体与
\u alert
交换为一种expando temp。是的。我做了一个回滚,以避免模糊问题:)+1的代理模式,以真正覆盖func,并确保它不会被篡改!啊
apply()
在Internet Explorer 8的
窗口中不可用。警报
。听到这个消息我很抱歉<代码>应用
函数
对象的一种方法。因此,他们必须明确地将其限制为
警报
?!他们一定是使用代理模式覆盖了它:DOlder浏览器不支持此功能,并且会在“window.alert=”上引发异常,如果您的替换是非阻塞的,则可能会有危险。例如,调用
警报(“重新加载”)
然后重新加载网页的代码。用户可能永远看不到警报文本。这不一定会覆盖其他帧中的函数。罗伯特:是的,有充分的理由。不同的框架基本上是不同的HTML文档,每个框架都有自己的Javascript“实例”。您确定Window.prototype.alert在2017年仍然是一个函数吗P
Window.prototype.alert = function(){}
function alert(message) { 
  console.info(message);
  debugger;
} 

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