未定义的ParentNode DOM错误onmouseout

时间:2011-07-21 17:04:03

标签: javascript firefox dom

怎么样,

[here is a small page illustrating my problem](问题出现在Firefox中)

所以我有一个函数onmouseout="regress(event, this)"来测试鼠标实际是否超出了当前元素及其任何子元素。 (more details on why I did this and what is the matter)。 如果鼠标真的在外面,我想停止按钮上的动画并重置一个计时器(我做了)。它有效。

只有它没有。在Firefox(测试版v5.0)中。我收到了与DOM相关的错误。触发该函数的元素的parentNode为“”,然后其父元素将为“未定义”,然后出现错误并且代码爆炸。

这是令人困惑的部分:只有当鼠标真正脱离按钮区域时才会出现此错误。还有另一种情况是onmouseout事件被触发(为了避免我使用这个函数)。这是按钮的另一个孩子的按钮的孩子。在这种情况下,parentNode工作正常,从buttonChild到button到buttonParent再到blabla到BODY然后停止。

我的问题是,为什么未定义的错误出现在一个案例中而不出现在另一个案例中。请注意,Chrome或IE9中没有错误。另外我该如何解决?

这令我感到困惑。谢谢你的帮助。

我很困惑。

此处还有javascript函数:

function regress(evt, x){
    //if (!e && window.event) 
    if (window.event) 
        var e = window.event;
    else
        var e = evt; //if we got here, you're using Firefox
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;

    while (reltg.tagName != 'body')
    {   
        //alert(reltg.id+" == " + x.id);
        if (reltg.id == x.id)
        {

            return;
        }
        reltg = reltg.parentNode;
        //alert(reltg.tagName);
    }
    // I'm on true mouseout, do stuff here:
    $("#"+x.id+"ThickParent").stop(true, false);
    $("#"+x.id+"ThickParent").width(0);

    canStartAgain=true;

    stopInterval = true;
    timerValue = 1.50;
    $("#"+x.id+"Timer").html("");
    //thanks to: http://www.webmasterworld.com/javascript/3752159.htm
}

取消注释//alert(reltg.id+" == " + x.id);以确切了解onmouseout何时被触发以及什么元素reltg.parentNode在什么时间开启。

1 个答案:

答案 0 :(得分:2)

几个月前我遇到了同样的问题。你会注意到从顶端退出错误不会发生。由于某种原因,“body”标签变窄以适合内部div并延伸到顶部,当移动到botton(或leff或right)时,FF触发事件,相关目标指向“html”标签并且你的循环停止条件是标签是“身体”标签。 “html”标记的父级是文档,文档的父级是null,当您尝试访问tagName的{​​{1}}属性时,会抛出错误。要达到预期效果,您必须将停止条件更改为null,或者将最有效的错误更改为while (reltg.tagName != 'html')