イベント ハンドラーを登録するためのクロスブラウザー機能と、(ほぼ) 一貫したハンドラー エクスペリエンスが必要です。jQuery などのライブラリの全重量や機能は必要ないので、独自のライブラリを作成しました。以下のコードで目標を達成したと思います。これまでのところ、テストは成功していますが、あまりにも長い間見つめていました。私のロジックに欠けている欠陥や落とし穴はありますか?
EDIT 1:明確にするために、ブラウザの意図で各ブロックにコメントを付けました。IE ブロックを更新して、すぐに呼び出さないようにしました ( Andy E の鋭い目 のfunc
おかげです)。
編集 2:func.call()
のthis
代わりに で呼び出すように IE ブロックを更新しましelem
た。
編集 3:「良い部分」でJSLintを渡すように更新されました。
function hookEvent(elem, evt, func)
{
if (typeof elem === "string")
{
elem = document.getElementById(elem);
}
if (!elem)
{
return null;
}
var old, r;
if (elem.addEventListener) //w3c
{
elem.addEventListener(evt, func, false);
r = true;
}
else if (elem.attachEvent) //ie
{
elem[evt + func] = function ()
{
func.call(this, window.event);
};
r = elem.attachEvent("on" + evt, elem[evt + func]);
}
else //old
{
old = elem["on" + evt] ? elem["on" + evt] : function (e) { };
elem["on" + evt] = function (e)
{
if (!e)
{
e = window.event;
}
old.call(this, e);
func.call(this, e);
};
r = true;
}
return r;
}