2009-08-08 82 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 2009-08-08 22:56:32

+1

如果你真的希望事件處理器的「this」上下文被設置爲你調用該函數的對象,那麼你將需要使用「call」或「apply」方法和返回閉包的函數。 例如(menuItem [index]));返回function(){ ShowListener.call(obj); }; } menuItem [index] .attachEvent(「onclick」,function(obj){ } – Alex 2009-08-09 04:15:43

3

作爲除了上述的答案,我一般用編碼更多的JavaScript-Y的這樣:

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