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


207

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

  • どのブラウザがこれをサポートしていますか?
  • これをサポートしているブラウザのバージョンはどれですか?
  • 関数をオーバーライドする際の危険は何ですか?

それは無限ループではありませんか?
プール

1
@ニック-いいえ、そうではありません。「通常の」window.alert関数はwindow._alertに割り当てられます。> After <その後、window.alert関数が再定義されます。
Chris Shouts、

@roosteronacid:あなたのコードでは、意味的だったと構文的に細かい、しかし...再帰のノーチャンスが...笑本質的にはあなただけ指摘@ paper1337よう、工夫スワップと関数本体_alertの一種としてはExpando最初のインスタンスでの一時を。
ノンセクトール2009年

はい。質問を曖昧にしないように、私はあなたをロールバックしました:)
cllpse 2009年

回答:


210

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

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

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

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

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

詳細はこちら:JQueryのタイプ#プロキシパターン


プロキシパターンを+1して、func を本当にオーバーライドし、改ざんされないようにします。
Josh Stodola、

15
うわっ!apply()上では使用できませんwindow.alertInternet Explorerの8の
cllpse

申し訳ありませんapplyが、Functionオブジェクトのメソッドです。したがって、明示的に制限する必要がありalertますか?
Mike Gleason jr Couturier

4
彼らはプロキシパターンを使用してそれを上書きしたに違いありません:D
Josh Stodola '13 / 11/09

古いブラウザはこれをサポートしておらず、 "window.alert ="で例外をスローします
Chris Pietschmann

23

ほとんどのブラウザはそれを上書きすることをサポートしていますが、それを使って何をしているのかに注意してください。

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

あなたは善良な市民であり、ネイティブ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);

15

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

例えば:

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

alert('This is an override.');

11
交換品がノンブロッキングの場合、危険生じる可能性があります。たとえばalert("Reloading")、Webページを呼び出してリロードするコードです。アラートテキストがユーザーに表示されない場合があります。
ダリアン

13

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


12

他の多くの答えで述べたように、関数をオーバーライドするだけで

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を
Robert

ロバート:はい、それには正当な理由があります。異なるフレームは基本的に異なるHTMLドキュメントであり、それぞれがJavascriptの独自の「インスタンス」を持っています。
Rolf

Window.prototype.alertが2017年も機能していることを確認しますか?:P
iplus26

6

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

4

alert()関数のオーバーライドの私の経験は、「​​登録してください!」と表示されたJavaScriptライブラリの試用版を「ハッキング」するために一度使用したことです。時々アラートを介して画面をナグ。

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

これはテスト専用で、後でフルバージョンを購入したので、ここでは不道徳なことは何もありません;-)


3

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

危険は非常に単純です。alert()などの一般的に知られている関数をオーバーライドすることにより、他のチームメンバーを完全に狂わせることになります。

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


2

確かにFirefoxとIE8で動作します。私はそれが動作しないブラウザが存在することを確認できません。これは、JavaScriptがどのように動作するかについての基本的なものです。


1
特にターゲットとするブラウザはIE6で、他のブラウザはそれで大丈夫でしょう。
AnthonyWJones 2009年

1

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

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

0

jsブラウザーの機能に関してwindow.alertは、卓越していて最もよく知られていますが、jsを知らない人も知っていますalert()- 現在使用中のすべてのブラウザーサポートされおり、コードスニペットも同様です。ただし、alert()実際にalert()はテンプレートなしで使用する必要があり、おそらくそうする必要があるので、私はあなたの特定のユースケースをオーバーライドしません(これはOOPの意味でのオーバーライドではなくリファクタリングのようなものです)。これを行う別の非アラート機能。


0

デフォルトのメッセージを実際のアラートメッセージとともに表示するという要件に直面しました。これが私がなんとかやってやった方法です。


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

私はそれをクロムでテストしました。それが良い練習かどうかはわかりませんが、目的は果たしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.