if(typeof(HTMLElement)!="undefined")    //给firefox定义contains()方法,ie下不起作用
{  
  HTMLElement.prototype.contains=function(obj)  
  {  
  while(obj!=null&&typeof(obj.tagName)!="undefind"){ //通过循环对比来判断是不是obj的父元素
     if(obj==this) return true;  
    obj=obj.parentNode;
  }  
 return false;  
  };  

isFirefox = /firefox/.test(navigator.userAgent.toLowerCase());

function muOutTop(theEvent){ //theEvent用来传入事件,Firefox的方式
  if (theEvent){
    var hmTopID = document.getElementById(''hmMenuTop'');
 if (isFirefox){ //如果是Firefox
      if (hmTopID.contains(theEvent.relatedTarget)) { //如果是子元素
        return;   //结束函式
      }
    }else{
      if (hmTopID.contains(event.toElement)) { //如果是子元素
        return; //结束函式
      }
 }
  }
  SwhMenu(MD);
  /*要执行的操作*/
}





错误: document.getElementById("hmMenuTop").contains is not a function
源文件:http://localhost:315/pfile/pub/jsmenu.js?r=AE44A6B4D8653D8
行:31

解决OnmouseOut违背逻辑的办法
http://www.enet.com.cn/article/2007/1031/A20071031888879.shtml

如何解决javascript中Onmouseout的问题
http://wuchangshengp27.blog.163.com/blog/static/6054376120096165107552/

============================= n

解决js中OnmouseOut事件冒泡的问题 
http://hi.baidu.com/liangwenfa/blog/item/a6ddeeddc5dcd3e777c638d9.html

到此为止所有要解决的问题都得到了解决,当触发OnmouseOut事件时我们针对不同的浏览器先获取鼠标到达的元素,然后通过判断该元素是否在信息栏(div)内,如果元素是子元素,那么不执行OnmouseOut事件,反之则执行事件,隐藏信息栏,完成后的代码如下:
function hideMsgBox(theEvent){ //theEvent用来传入事件,Firefox的方式
        if (theEvent){
               var browser=navigator.userAgent;   //取得浏览器属性
               if (browser.indexOf("Firefox")>0){ //如果是Firefox
                    if (document.getElementById(''MsgBox'').contains(theEvent.relatedTarget)) { //如果是子元素
                        return;   //结束函式
                        }
                }
                  if (browser.indexOf("MSIE")>0){ //如果是IE
                          if (document.getElementById(''MsgBox'').contains(event.toElement)) { //如果是子元素
                                return; //结束函式
                           }
                 }
             }
            /*要执行的操作*/
}


在信息栏(Div)上设置OnmouseOut=hideMsgBox(event)来调用,圆满解决冒泡问题。
事实上通过设置
window.event.cancelBubble = true (IE) event.stopPropagation() event.preventDefault() (Firefox)
也可以解决问题,但是需要遍历所有子元素,影响效率,所以还是在触发OnmouseOut事件时再进行上述判断分别处理比较合适。


解决OnmouseOut违背逻辑的办法
http://www.enet.com.cn/article/2007/1031/A20071031888879.shtml

鼠标移出这个层的时候,就触发OnmouseOut事件,将层隐藏掉。
但是,如果你的鼠标接触到文字的时候,由于你接触到了A标记,而A标记在div1上边,所以就认为鼠标已经出了div1的范围了,就执行OnmouseOut了,这个实际上并不是我们的本意。
所以只能修改了一下HideDiv()方法,使其符合我们的要求
function HideDiv(pName){
var obj = event.toElement;
while( obj!=null && obj.id!=pName ){
obj = obj.parentElement;
}
if( obj==null ){ document.all[''div1''].style.display = ''none''; }
}大概意思是,当触发OnmouseOut事件时,先获取鼠标当前所指向的元素(对象),
然后用递归方法,一层一层的往外找它的父元素,判断有没有叫div1的。
如果一直到页面最外一层还找不到的话,那就把层隐藏了,
如果找到的话,说明是div1的子元素,就不做任何事。

 

如何解决javascript中Onmouseout的问题
http://wuchangshengp27.blog.163.com/blog/static/6054376120096165107552/