javascriptで水平メニューをドロップしようとしています。 FirefoxとChromeではうまく動作しますが、IEで問題が発生します。ここで attachEventに問題があります
は私がfunction init(){
hideAllSubMenu();
var menuItem = document.getElementById("menu_wrap").getElementsByTagName("div");
for(var index = 0; index < menuItem.length; index++)
{
// if firefox and all oother browsers
if(typeof menuItem[index].addEventListener != "undefined")
{
menuItem[index].addEventListener("mouseover", ShowListener, false);
menuItem[index].addEventListener("click", ShowListener, false);
}
else //IE
{
menuItem[index].attachEvent("onclick", ShowListener);
menuItem[index].attachEvent("onmouseover", ShowListener);
}
}
}
function ShowListener(event)
{
hideAllSubMenu();
var menuItemIdStr = this.id;
var menuItemIdNum = menuItemIdStr.replace(/menu/i, "");
var subMenu = document.getElementById("submenu_wrap" + menuItemIdNum);
subMenu.style.left = this.offsetLeft + "px";
subMenu.style.top = this.offsetTop + this.offsetHeight + 2 + "px";
subMenu.style.display = "block";
}
にですが、その約この文句のように見えていたコードです。 私はIEのイベントリスナー関数はコピーではなく参照であり、それはなぜこのが私に問題を与えていることを理解しています。 この問題を回避する方法はありますか?
私は、IEのためのattachEventのための別個の関数を作成しようとしました。その
menuItem[index].attachEvent("onmouseover", ShowListenerIE(menuItem[index]));
ノートのような
何か:私はjQueryのに機能して、このシンプルなメニューを書き換えることを計画んが、今の私には、JavaScriptのコア+ DOMを学ぶことに興味を持っていて、周りの道を見つけたいですこの問題。
ありがとうございます。
私はVARターゲット= event.srcElementで終わりに行きましたか? event.srcElement:event.target; あなたが私に与えたものはテストしませんでしたが、あなたの解決策はうまくいくと思われます – Dmitris
実際にイベントハンドラがこの関数を呼び出したオブジェクトに設定されるためには "this"のコンテキストが必要な場合は、クロージャを返す関数で "call"または "apply"メソッドを使用する必要があります。 (menuItem [index])); menuItem [index] .attachEvent( "onclick"、function(obj){ return function(){ ShowListener.call(obj); }; } – Alex