1

我正在尝试在 javascript 中做下拉水平菜单。它在 Firefox 和 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 的 attachEvent 创建单独的函数,并直接在那里路径对象,但是它仍然在抱怨。

类似的东西

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

注意:我确实计划将这个简单的菜单功能重写为 JQuery,但现在我对学习 JavaScript Core + DOM 很感兴趣,并且想找到解决这个问题的方法。

提前致谢。

4

2 回答 2

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

有关更多血腥细节,请参见此处。免责声明:我的代码未经测试。

于 2009-08-08T22:09:18.603 回答
3

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

function eventHandler( event ){
    var event  = window.event || event;
    var target = event.srcElement || event.target;
}
于 2009-08-09T03:32:32.313 回答