alert()
JavaScriptで関数をオーバーライドした経験はありますか?
- どのブラウザがこれをサポートしていますか?
- これをサポートしているブラウザのバージョンはどれですか?
- 関数をオーバーライドする際の危険は何ですか?
_alert
の一種としてはExpando最初のインスタンスでの一時を。
alert()
JavaScriptで関数をオーバーライドした経験はありますか?
_alert
の一種としてはExpando最初のインスタンスでの一時を。
回答:
間違いなく「サポート」されています。それはあなたのウェブページであり、あなたはそれでやりたいことを何でもします。
ライブラリを変更せずにイベントに忍び込むことで、分析イベントを追跡するためにこれをすでに行いました。
プロキシパターンを使用します。
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
必要に応じて、元の関数の呼び出しをバイパスすることもできます(プロキシ)
詳細はこちら:JQueryのタイプ#プロキシパターン
apply()
上では使用できませんwindow.alert
Internet Explorerの8の
apply
が、Function
オブジェクトのメソッドです。したがって、明示的に制限する必要がありalert
ますか?
ほとんどのブラウザはそれを上書きすることをサポートしていますが、それを使って何をしているのかに注意してください。
デフォルトのアラートボックスは実行スレッドをブロックするため、この動作に依存する一部のライブラリは(せいぜい)機能しなくなる可能性があります。
あなたは善良な市民であり、ネイティブ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);
オーバーリング警報機能に危険はありません。すべてのブラウザがそれをサポートしています。
例えば:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
alert("Reloading")
、Webページを呼び出してリロードするコードです。アラートテキストがユーザーに表示されない場合があります。
他の多くの答えで述べたように、関数をオーバーライドするだけで
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);
最新のブラウザーのすべてのJavaScript実装は、オーバーライドをサポートしています。
危険は非常に単純です。alert()などの一般的に知られている関数をオーバーライドすることにより、他のチームメンバーを完全に狂わせることになります。
そのため、既存のコードを何らかの方法でデバッグまたはハッキングするツールとして関数をオーバーライドしない限り、それを行う理由はありません。新しい関数を作成するだけです。
確かにFirefoxとIE8で動作します。私はそれが動作しないブラウザが存在することを確認できません。これは、JavaScriptがどのように動作するかについての基本的なものです。
アラートがどこから来ているのかを見つけるために私が行う簡単なハックは、コンソールに移動してこれを入力することです
function alert(message) {
console.info(message);
debugger;
}