JavaScript:覆盖alert()

2020/10/16 02:41 · javascript ·  · 0评论

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

  • 哪些浏览器支持此功能?
  • 哪些浏览器版本支持此功能?
  • 覆盖该功能有哪些危险?

绝对是“受支持的”。这是您的网页,您可以使用它进行任何操作。

我已经这样做了,可以在不修改库的情况下通过潜入事件来跟踪分析事件。

使用代理模式:

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

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

更多信息在这里:jQuery类型#Proxy模式

尽管大多数浏览器都支持覆盖它,但是请谨慎使用它。

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

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

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

例如:

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

alert('This is an override.');

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

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

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()函数和瞧。

这只是出于测试目的,我们稍后购买了完整版,因此这里没有不道德的事情;-)

现代浏览器中的所有JavaScript实现都支持重写。

危险非常简单,那就是您将通过覆盖众所周知的功能(例如alert())而使其他团队成员绝对疯狂。

因此,除非您将功能作为一种工具来调试或破解现有代码,否则我看不出有任何理由这样做。只需创建一个新功能。

它肯定可以在Firefox和ie8中工作。我看不到有没有任何浏览器无法使用。这是javascript工作原理的基本原理,尽管人们并不经常看到它与诸如那==的本机函数一起使用。

我要查找警报的来源的一个快速技巧是进入控制台,然后输入

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

当涉及到js时,浏览器功能window.alert是最著名的,最知名的是不了解js的人知道alert()-放心,今天使用的所有浏览器都支持js ,您的代码段也是如此。但是,alert()对于您的特定用例,我不会覆盖(嗯,这更像是重构,而不是在OOP中覆盖),因为当您实际上需要不使用alert()模板时,您可能会需要,另一个非警报功能。

我已经遇到了必须显示默认消息以及实际警报消息的要求。这就是我设法做到的方式。


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

我已经在chrome上测试过了。我不确定它是否是一个很好的实践,但是它可以达到目的。

本文地址:http://javascript.askforanswer.com/javascriptfugaialert.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!