7

私が次のようなものを持っている場合

alert = 0;

別のスクリプトで。

これは別のスクリプトにあり、私のコードはそのスクリプトの前にロードできません。

alertスクリプトで元のメソッドを呼び出すにはどうすればよいですか?

4

2 に答える 2

15

元の をオーバーライドする前にalert、保存してください。

var origAlert = alert;
alert = 0;
origAlert("foo");

デモ: http://jsfiddle.net/jfriend00/tnNE7/


元の値を保存できない場合、私が知っている唯一の他の方法は、iframe にアクセスすることです。次に例を示します。

alert = 0;
var iframe = document.createElement("iframe");
iframe.height = 0;
iframe.width = 0;
document.body.appendChild(iframe);
iframe.contentWindow.alert.call(window, "foo");​

作業例: http://jsfiddle.net/jfriend00/waMEV/

すべてのブラウザーでこれを試したわけではありませんが、Chrome、IE、Firefox で動作し、他のブラウザーでも動作するはずです。

于 2012-08-04T05:32:44.210 に答える
5

わかりました、これが醜い答えであることを認めたのは私が初めてですが、うまくいくようです:

alert = 0;

var win = window.open(),
    method = win.alert;
win.close();

method.call(window, "my message");

ここでフィドル。alert基本的に、新しいウィンドウ インスタンスを作成し、そのメソッドを盗みます。欠点は、短い時間ではありますが、実際には新しいブラウザ ウィンドウを開く必要があることです。これが実際にあなたの問題に対する実用的な解決策であるとは思えません - あなたが作業しようとしている他のサイトと、あなたの解決策がエンドユーザーにどのように見えるかをどれだけ気にするかによって異なります.

編集:これは、上記の回答とjfriend00の回答の組み合わせであり、「新しいウィンドウを開く」問題を解決します。a)メソッドを呼び出す必要があるときにiframeがまだDOMにあることに依存せず、b)任意のwindowメソッドに一般化できる必要があるため、これはやや良いオプションだと思います.jfriend00の答えはおそらくそうです' t。

alert = 0;

// make a new window instance in an iframe
var iframe = document.createElement("iframe");
iframe.height = iframe.width = 0;
document.body.appendChild(iframe);
// steal the method
var method = iframe.contentWindow.alert;
// remove the evidence
document.body.removeChild(iframe);

// now use the method for your own purposes
function myAlert(message) {
    method.call(window, message);
}
myAlert("foo");
于 2012-08-04T06:05:07.460 に答える