javascript - attachEvent 带来麻烦

标签 javascript dom-events

我正在尝试在 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";
}

它似乎在提示this。 我知道在 IE 中事件监听器函数不是复制而是引用,这就是为什么 this 给我一个问题。 有办法解决这个问题吗?

我什至尝试为 IE 的 attachEvent 创建单独的函数并直接在其中创建对象路径,但它仍然在提示。

类似的东西:

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

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

最佳答案

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

关于javascript - attachEvent 带来麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1249958/

相关文章:

javascript - 我需要用该标签java脚本中的内容替换字符串中的<mark>标签

javascript - Laravel 使用 Vueify

javascript - 如何使用javascript获取位于范围内的节点?

javascript - AngularJS:ng-model 将 int 转换为字符串

javascript - 如何从事件函数的模块模式中调用函数

javascript - 当查找事件完成时运行函数

javascript - javascript 中的 return false 和 event.preventDefault 有什么不同?

javascript - Mocha,应该 - 当测试有 promise 的异步函数时,断言错误是无声的

javascript - session 超时时无法在页面回调中调用 Response.Redirect?

javascript - dojo/on 和 dojo/aspect 的区别