2009-11-13 55 views
188

有没有人有重写JavaScript中的alert()函数的经验?JavaScript:重写提醒()

  • 哪些浏览器支持此功能?
  • 哪个浏览器版本支持?
  • 重写函数有什么危险?
+10

如果你倒票,解释原因。这可能只是因为我有一个完全合理的理由来做这件事。 – roosteronacid 2009-11-13 14:31:52

+20

我不明白这里的倒票。 – 2009-11-13 14:32:43

+0

这不是一个无限循环吗? – Pool 2009-11-13 14:39:40

回答

188

这绝对是“支持”。这是你的网页,你可以随心所欲地做任何事情。

我已经做到了这一点,不用修改库而是通过潜入事件来跟踪分析事件。

使用代理模式:

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

您还可以绕过原来的函数调用,如果你想要的(代理)

此处了解详情:JQuery Types #Proxy Pattern

+0

绝妙的回答!我完全忘记了那个模式:) – roosteronacid 2009-11-13 15:00:28

+0

没问题!我也对此分享乔什斯托多拉的观点,太棒了。 – 2009-11-13 15:03:01

+0

是的。已经提出了他的答案。你的情况更加明确。它带有一个例子。这总是一个人群,pleaser :) – roosteronacid 2009-11-13 15:06:08

2

它确实在firefox和ie8中有效。我看不到有什么浏览器不能工作。这对于javascript的工作原理来说非常重要,即使人们不经常看到它与本机功能一起使用=)

+1

专门针对IE浏览器将是IE6的其他人可能会好起来。 – AnthonyWJones 2009-11-13 14:29:40

13

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

2

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

危险很简单,你可以通过重写alert()等常用函数来让其他团队成员完全疯狂。

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

-1

当谈到js的浏览器功能window.alert是杰出和最知名的,人们不知道谁JS知道alert() - 放心它在所有的浏览器目前使用支持,您的代码段是以及。然而,我不会覆盖(这更像是重构而不是覆盖在OOP意义上)alert()作为你的特定用例,因为当你实际上需要使用alert()而没有模板,并且你可能会,我需要另一个非警报功能来做到这一点。

4

我与压倒一切的警报经验()函数是我们曾经用它来“黑客”试用版的JavaScript库,显示“请注册!”通过警报时间的唠叨屏幕。

我们刚刚定义了我们自己的alert()函数和voila。

这是仅用于测试目的,我们后来又买了完整版,所以没有什么不道德的事情在这里;-)

14

有在Overring报警功能没有危险。每个浏览器都会支持它。

例如:

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

alert('This is an override.'); 
+7

上抛出异常,如果您的替换是非阻塞的,则可能会有危险。例如,调用alert(“重新加载”)并重新加载网页的代码。警报文本可能永远不会被用户看到。 – Darien 2014-01-22 23:26:25

22

虽然大多数浏览器都支持覆盖它,小心你用它做什么。

由于默认警告框会阻止执行线程,因此一些依赖此行为的库可能无法工作(最好)。

你应该是一个好公民,并避免触及本地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); 
7

拉吉斯拉夫。
对于IE8可以像这样重新定义警报()

/** 
* 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); 
9

正如在许多其他的答案说,你可以只覆盖函数

window.alert = null 

window.alert = function(){} 

然而,这并不必然覆盖在Window构造函数的原型功能(注意是大写W),所以黑客仍然可以键入:

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

因此,您还需要重写函数:

Window.prototype.alert = null 

Window.prototype.alert = function(){} 
+0

这不一定会覆盖其他框架中的功能。见http://jsfiddle.net/18znqbjd/1/ – Robert 2014-08-12 06:58:37

+0

罗伯特:是的,有很好的理由。不同的框架基本上是不同的HTML文档,每个都有自己的Javascript实例。 – Rolf 2015-10-21 10:37:08

+0

你确定Window.prototype.alert在2017年仍然是一个函数吗? :P – iplus26 2017-02-22 12:10:33

1

快速黑客,我做寻找到警报s来自,是去控制台,然后输入这个

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