JavaScript:覆盖警报()

IT技术 javascript overriding
2021-01-21 20:13:44

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

  • 哪些浏览器支持这个?
  • 哪些浏览器版本支持这个?
  • 覆盖函数有什么危险?
6个回答

这绝对是“支持”的。这是您的网页,您可以对它做任何想做的事情。

我已经这样做了,无需修改库,而是通过潜入事件来跟踪分析事件。

使用代理模式:

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

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

更多信息:JQuery Types #Proxy Pattern

我很遗憾听到..applyFunction对象的方法所以他们必须明确限制它alert?!
2021-03-23 20:13:44
他们必须使用代理模式覆盖它:D
2021-03-29 20:13:44
较旧的浏览器不支持此功能,并且会在“window.alert =”上抛出异常
2021-04-02 20:13:44
啊! 在 Internet Explorer 8 中apply()不可用window.alert
2021-04-03 20:13:44
+1 在代理模式上真正覆盖 func 并确保它不会被篡改!
2021-04-06 20:13:44

尽管大多数浏览器都支持覆盖它,但在使用它时要小心。

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

你应该做一个好公民,避免接触原生 API。如果这样做,则在使用 3rd 方代码时可能会破坏事情。

然而,如果您想在特定上下文中重新定义警报行为,您可以将其包含在一个匿名函数中,如下所示:

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

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

例如:

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

alert('This is an override.');
可能是一个危险,如果你更换无阻塞。例如,调用alert("Reloading")然后重新加载网页的代码用户可能永远不会看到警报文本。
2021-03-20 20:13:44

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

window.alert = null

或者

window.alert = function(){}

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

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

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

Window.prototype.alert = null

或者

Window.prototype.alert = function(){}
这不一定会覆盖其他框架中的功能。参见jsfiddle.net/18znqbjd/1
2021-03-11 20:13:44
罗伯特:是的,并且有充分的理由。不同的框架基本上是不同的 HTML 文档,每个文档都有自己的 Javascript“实例”。
2021-03-23 20:13:44
你确定 Window.prototype.alert 在 2017 年仍然是一个函数吗? :P
2021-04-07 20:13:44

我认为每个 Javascript 实现都会支持这一点,并且不涉及任何危险。通常使用 HTML/CSS 将普通的 OS 样式的警告框替换为更优雅的东西。这样做意味着您不必更改现有代码!事实上,它是可能的,这让 Javascript 变得很棒。