2009-08-08 9 views
1

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を学ぶことに興味を持っていて、周りの道を見つけたいですこの問題。

ありがとうございます。

答えて

3

IEでのイベントのターゲットはevent.srcElementです。他のブラウザでも同様の情報を得ることができます。event.targetまた、IEはハンドラへの引数としてイベントを渡しません - 代わりにwindow.eventにあります。だから、完全なソリューション:

if (!event) 
{ 
    event = window.event; //IE 
} 

var target; 
if (event.target) 
{ 
    target = event.target; 
} 
else if (event.srcElement) 
{ 
    target = event.srcElement; 
} 

//From here on is your code, use target instead of this 

は、より多くの血みどろの詳細についてはhereを参照してください。免責事項:私のコードはテストされていません。上記の回答に加えとして

+0

私はVARターゲット= event.srcElementで終わりに行きましたか? event.srcElement:event.target; あなたが私に与えたものはテストしませんでしたが、あなたの解決策はうまくいくと思われます – Dmitris

+1

実際にイベントハンドラがこの関数を呼び出したオブジェクトに設定されるためには "this"のコンテキストが必要な場合は、クロージャを返す関数で "call"または "apply"メソッドを使用する必要があります。 (menuItem [index])); menuItem [index] .attachEvent( "onclick"、function(obj){ return function(){ ShowListener.call(obj); }; } – Alex

3

、私は一般的に、よりJavaScriptを-Yをコーディングするこの方法を使用します。

function eventHandler(event){ 
    var event = window.event || event; 
    var target = event.srcElement || event.target; 
}