代码之家  ›  专栏  ›  技术社区  ›  Dmitris

附件出问题

  •  1
  • Dmitris  · 技术社区  · 16 年前

    我正在尝试用JavaScript做下拉式水平菜单。它在火狐和Chrome上都很好用,但是在IE上给我带来了麻烦。

    这是我的密码

    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和path there对象直接创建单独的attachEvent函数,但是它仍然在抱怨。

    像那样的

    menuItem[index].attachEvent("onmouseover", ShowListenerIE(menuItem[index]));
    

    注意:我计划将这个功能中的简单菜单重写为jquery,但目前我对学习javascript core+dom很感兴趣,希望找到解决这个问题的方法。

    事先谢谢。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Jason Plank Maksim Kondratyuk    14 年前

    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 更血腥的细节。免责声明:我的代码未经测试。

        2
  •  3
  •   Mehmet Duran    16 年前

    作为上述答案的补充,我通常使用这种方式对更多的javascript-y进行编码:

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