2009-08-08 60 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; 
}