すべてのボタンが通常の onclick イベントの前後にアクションを実行するようにします。そこで、これらすべての要素をループしてラッパー関数を作成するという「素晴らしい」アイデアを思いつきました。
これは、テストしたときはうまく機能しているように見えましたが、アプリに統合するとうまくいきませんでした。「this」の値がラッパーによって変更されたことをたどりました。サンプル コードはこれを示しています。イベント ハンドラーをラップする前は、クリックすると各ボタンにボタン ID が表示されますが、ラップ後に表示される名前は、この例では「未定義」、フォーム内から実行した場合は「Form1」です。
同じことを行うためのより良い方法を知っている人はいますか? または、当初意図されていた「この」値を維持するための良い方法はありますか?
ご想像のとおり、ターゲット ボタンの既存のイベント ハンドラー コードを変更したくありません。
前もって感謝します。
PS - ターゲット ブラウザは IE6 以降で、クロスブラウザ機能は必要ありません
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script language="javascript" type="text/javascript">
function btnWrap_onClick()
{
var btns = document.getElementsByTagName("button");
for( var i = 0; i < btns.length; i++)
{
var btn = btns[i];
// handle wrap button differerntly
if( "btnWrap" == btn.id)
{
btn.disabled = true;
continue; // skip this button
}
// wrap it
var originalEventHandler = btn.onclick;
btn.onclick = function()
{
alert("Starting event handler");
originalEventHandler();
alert("Finished event handler");
}
}
alert("Buttons wrapped successfully");
}
</script>
<body>
<p>
<button id="TestButton1" onclick="alert(this.id);">TestButton1</button>
<button id="TestButton2" onclick="alert(this.id);">TestButton2</button>
</p>
<button id="btnWrap" onclick="btnWrap_onClick();">Wrap Event Handlers</button>
</body>
</html>