web-dev-qa-db-ja.com

JavaScript:alert()のオーバーライド

JavaScriptでalert()関数をオーバーライドした経験はありますか?

  • どのブラウザがこれをサポートしていますか?
  • どのブラウザバージョンがこれをサポートしていますか?
  • 機能をオーバーライドすることの危険性は何ですか?
205
cllpse

それは間違いなく「サポート」されています。それはあなたのウェブページであり、あなたはそれでやりたいことを何でもします。

ライブラリを変更せずに、イベントに潜入することで、分析イベントを追跡するためにすでにこれを行いました。

プロキシパターンを使用します。

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

必要に応じて、元の関数の呼び出しをバイパスすることもできます(プロキシ)

詳細はこちら: JQuery Types #Proxy Pattern

ほとんどのブラウザはオーバーライドをサポートしていますが、あなたがそれで何をしているのかに注意してください。

デフォルトの警告ボックスは実行スレッドをブロックするため、この動作に依存している一部のライブラリは動作しない可能性があります(せいぜい)。

良き市民であり、ネイティブ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);
23
Pablo Cabrera

オーバーリング警告機能には危険はありません。すべてのブラウザがサポートしています。

例えば:

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

alert('This is an override.');
15
user160820

すべてのJavascript実装がこれをサポートすると思いますが、それに伴う危険はありません。一般的に、OSスタイルの単純なアラートボックスをHTML/CSSでよりエレガントなものに置き換えるために行われます。このようにすることで、既存のコードを変更する必要がなくなります!それが可能であるという事実は、Javascriptを素晴らしいものにします。

13
Josh Stodola

他の多くの回答で述べたように、次のように関数をオーバーライドできます。

window.alert = null

または

window.alert = function(){}

ただし、これは必ずしもWindowコンストラクターのプロトタイプの関数(大文字のWに注意)をオーバーライドしないため、ハッカーは次のように入力できます。

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

したがって、次の関数でその関数をオーバーライドする必要もあります。

Window.prototype.alert = null

または

Window.prototype.alert = function(){}
12
Jack

ラディスラフ。
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);
7
Vitaliy R.

Alert()関数をオーバーライドした私の経験は、かつてそれを使用して、「登録してください!」と表示されたJavaScriptライブラリの試用版を「ハッキング」したことです。時々アラート画面を表示します。

独自のalert()関数と出来上がりを定義しました。

テスト目的のみで、後でフルバージョンを購入したので、ここで不道徳なことは何もしていません;-)

4
Josef Sábl

最新のブラウザーでのJavaScript実装はすべて、オーバーライドをサポートしています。

Alert()などのよく知られている機能をオーバーライドすることで、他のチームメンバーを絶対に夢中にさせる危険性は非常に単純です。

したがって、既存のコードを何らかの方法でデバッグまたはハッキングするためのツールとして関数をオーバーライドしない限り、それを行う理由はわかりません。新しい関数を作成するだけです。

3

Firefoxとie8で動作します。動作しないブラウザがあることはわかりません。これは、javascriptの動作の基本です。ただし、そのようなネイティブ関数で使用されることはほとんどありません=)

2
David Hedlund

アラートの送信元を見つけるために行う簡単なハックは、コンソールに移動してからこれを入力することです

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