我要的是只要光标还在wrap上就不触发onmouseout.
现在是光标移到a链接上都触发onmouseout.
<!doctype HTML>
<html>
<head>
<title>scroll</title>
<style type="text/css">
#box{width:400px;height:143px;overflow:hidden;position:relative;float:left}
ul{position:absolute;left:0;top:0;margin:0px}
#slider{width:10px;height:143px;background:#ccc;float:left;position:relative}
#slider_btn{position:absolute;top:0;left:0;height:30px;width:10px;background:orange}
#wrap{background:orange;padding:10px 0}
#wrap a{background:red}
#box{background:blue}
</style> </head>
<body> <div id="wrap">
<a href="">sdsad</a>
</div>
<div id="box">sdsd</div>
<script type="text/javascript">
var $ = function(id){return document.getElementById(id)};
function aa(){
$("box").style.display = "block";
console.log("aa")
}
function bb(){
$("box").style.display = "none";
console.log("bb")
}
$("wrap").onmouseover = function(e){
aa();
}
$("wrap").onmouseout = function(e){
bb();
}
</script>
</body>
</html>

解决方案 »

  1.   


    <!doctype HTML>
    <html>
        <head>
    <title>scroll</title>
            <style type="text/css">
                #box{width:400px;height:143px;overflow:hidden;position:relative;float:left}
                ul{position:absolute;left:0;top:0;margin:0px}
                #slider{width:10px;height:143px;background:#ccc;float:left;position:relative}
                #slider_btn{position:absolute;top:0;left:0;height:30px;width:10px;background:orange}
                #wrap{background:orange;padding:10px 0}
                #wrap a{background:red}
                #box{background:blue}
            </style>    </head>
        <body>        <div id="wrap">
                <a href="">sdsad</a>
            </div>
        <div id="box">sdsd</div>
            <script type="text/javascript">
                var $ = function(id){return document.getElementById(id)};
                function aa(){
                    $("box").style.display = "block";
                    console.log("aa")
                }
                function bb(){
                    $("box").style.display = "none";
                    console.log("bb")
                }
                $("wrap").onmouseover = function(e){
    aa();
                }
                $("wrap").onmouseout = function(e){
                 var ev = getEvent();
                 var obj = ev.toElement || ev.relatedTarget;
                 if(obj==this) bb();
                 else{
                 if(!this.contains(obj)) bb();
                 else return false;
                 }
                }if(typeof(HTMLElement)!="undefined")
    HTMLElement.prototype.contains = function(obj) {
    if(obj==this) return true;
    while(obj=obj.parentNode) if(obj==this) return true;
    return false;

    function getEvent() {
    if (document.all) return window.event;
    func = getEvent.caller;
    while (func != null) {
    var arg0 = func.arguments[0];
    if (arg0) {
    if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof (arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
    return arg0;
    }
    }
    func = func.caller;
    }
    return null;
    }        </script>
        </body>
    </html>
      

  2.   

    if (window.event) { 
    e.cancelBubble=true; 
    } else { 
    e.stopPropagation(); 
      

  3.   

    <!doctype HTML>
    <html>
        <head>
    <title>scroll</title>
        <style type="text/css">
            #box{width:400px;height:143px;overflow:hidden;position:relative;float:left;display:none}
            ul{position:absolute;left:0;top:0;margin:0px}
            #slider{width:10px;height:143px;background:#ccc;float:left;position:relative}
            #slider_btn{position:absolute;top:0;left:0;height:30px;width:10px;background:orange}
            #wrap{background:orange;padding:10px 0}
            #wrap a{background:red}
            #box{background:blue}
        </style>
        </head>
        <body>
            <div id="wrap">
                <a href="">sdsad</a>
            </div>
         <div id="box">sdsd</div>
            <script type="text/javascript">
                var $ = function(id){
                 return document.getElementById(id)
                };
                function aa(){
                    $("box").style.display = "block";
                    console.log("aa")
                }
                function bb(){
                    $("box").style.display = "none";
                    console.log("bb")
                }
                function hasChild(elem1, elem2){
                 var childs = elem1.getElementsByTagName('*');
                 for(var i = 0, len = childs.length; i < len; i++){
                 if(elem2 === childs[i]){
                 return true;
                 }
                 }
                 return false;
                }
                $("wrap").onmouseover = function(e){
                 var event = e || window.event,
                 target = event.target || event.srcElement,
                 relatedTarget = event.relatedTarget || event.fromElement;
                 if(target === this && !hasChild(this,relatedTarget)){
                        aa();
                    }
                }
                $("wrap").onmouseout = function(e){
                 var event = e || window.event,
                 target = event.target || event.srcElement,
                 relatedTarget = event.relatedTarget || event.toElement;
                 if(target === this && !hasChild(this,relatedTarget)){
                        bb();
                    }  
                }
            </script>
        </body>
    </html>
      

  4.   

    1楼的方法明显有问题,看下firebug控制台就知道了
      

  5.   

    你不看控制台信息吗?当鼠标移动a上时,会再次执行aa(),当鼠标从a上移到div上时,会执行bb()和aa(),虽然从视觉上看好像符合要求,但存在相当大的隐患
      

  6.   

    楼主的问题是 :现在是光标移到a链接上都触发onmouseout
    onmouseout并不调用aa(),我也没处理onmouseover
      

  7.   

    你还不明白你的代码存在的问题吗?当鼠标从div移动到a上是,会再次执行aa(),也就是重复执行了aa();当鼠标从a移动到div时,会先执行bb()再执行aa(),也就是先隐藏再显示,你不觉得很有问题吗?小一点讲这个从视觉效果上会有闪烁现象,大一点讲如果需求不是要隐藏显示另一个div,而是做一些其他事情比较计算什么的,这问题就完全暴露出来了。比较理想的功能应该是类似jquery的mouseenter和mouseleave一样。
      

  8.   

    汗,你试下不就知道了。。放个修改过的<!doctype HTML>
    <html>
        <head>
            <title>scroll</title>
            <style type="text/css">
                #box{width:400px;height:143px;overflow:hidden;position:relative;float:left;display:none}
                ul{position:absolute;left:0;top:0;margin:0px}
                #slider{width:10px;height:143px;background:#ccc;float:left;position:relative}
                #slider_btn{position:absolute;top:0;left:0;height:30px;width:10px;background:orange}
                #wrap{background:orange;padding:10px 0}
                #wrap a{background:red}
                #box{background:blue}
            </style>
        </head>
        <body>
            <div id="wrap">
                <a href="">sdsad</a>
            </div>
            <div id="box">sdsd</div>
            <script type="text/javascript">
                var $ = function(id){
                    return document.getElementById(id)
                };
                function aa(){
                    $("box").style.display = "block";
                    console.log("aa")
                }
                function bb(){
                    $("box").style.display = "none";
                    console.log("bb")
                }
                function hasChild(elem1, elem2){
                    var childs = elem1.getElementsByTagName('*');
                    for(var i = 0, len = childs.length; i < len; i++){
                        if(elem2 === childs[i]){
                            return true;
                        }
                    }
                    return false;
                }
                $("wrap").onmouseover = function(e){
                    var event = e || window.event,
                        target = event.target || event.srcElement,
                        relatedTarget = event.relatedTarget || event.fromElement;
                    if(!this.overStatus && relatedTarget !== this && !hasChild(this,relatedTarget)){
                        aa();
                        this.overStatus = true;
                    }
                }
                $("wrap").onmouseout = function(e){
                    var event = e || window.event,
                        target = event.target || event.srcElement,
                        relatedTarget = event.relatedTarget || event.toElement;
                    if(this.overStatus && relatedTarget !== this &&!hasChild(this,relatedTarget)){
                        bb();
                        delete this.overStatus;
                    }  
                }
            </script>
        </body>
    </html>
      

  9.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>
        <head>
    <title>scroll</title>
            <style type="text/css">
                #box{width:400px;height:143px;overflow:hidden;position:relative;float:left}
                ul{position:absolute;left:0;top:0;margin:0px}
                #slider{width:10px;height:143px;background:#ccc;float:left;position:relative}
                #slider_btn{position:absolute;top:0;left:0;height:30px;width:10px;background:orange}
                #wrap{background:orange;width:300px;padding:10px 0}
                #wrap a{background:red}
                #box{background:blue}
    #test{position:absolute;top:300px;left:0;}
            </style>    </head>
        <body>        <div id="wrap">
                <a href="">sdsad</a>
            </div>
            <div id="test" style="display"></div>
        <div id="box">sdsd</div>
            <script type="text/javascript">
                var $ = function(id){return document.getElementById(id)};
                function aa(){
                    $("box").style.display = "block";
                    $("test").innerHTML="aa";
                }
                function bb(){
                    $("box").style.display = "none";
                    $("test").innerHTML="bb";
                }
                $("wrap").onmouseover = function(e){
                        aa();
                }
                $("wrap").onmouseout = function(e){
                        bb();
                }
            </script>
        </body>
    </html>
      

  10.   

    我感觉楼主的这个例子根本不是事件冒泡。就是wrap的width没有设定,撑到整个页面宽。要关浏览器的话绕不过这个wrap去。呵呵。
    此外,console.log是什么用法?为什么我在我的DW上实验结果是未定义?盼解释。
      

  11.   

     if(!this.overStatus && relatedTarget !== this && !hasChild(this,relatedTarget)){ 这句是怎么样的顺序执行的 ?
      

  12.   

    他的问题的确不是事件冒泡,他的需求应该就是ie下的mouseenter和mouseleave的效果,console.log是firefox下的firebug插件的控制台打印方法。chrome的调试工具也有此方法。
      

  13.   

    这位小哥,你连js的运算符的优先级都搞不清楚吗。。
    if((!this.overStatus) && (relatedTarget !== this) && (!hasChild(this,relatedTarget)))写成这样能看清楚不?!this.overStatus是多余的,可以删除。
      

  14.   

    你这个方法ie不兼容吧?
    看看这段代码吧
    <!doctype HTML>
    <html>
        <head>
            <title>scroll</title>
            <style type="text/css">
                #box{width:400px;height:143px;overflow:hidden;position:relative;float:left;display:none}
                ul{position:absolute;left:0;top:0;margin:0px}
    #float{width:30px;background:orange;height:80px;position:absolute;top:50%;left:0;margin-top:-30px}
    #con{width:100px;background:red;height:120px;position:absolute;top:50%;left:-100px;margin-top:-30px}
    #con a{display:block;height:25px;background:yellow;margin-top:15px}
    #box{width:100px;height:100px;background:orange;margin-top:50px}
            </style>
        </head>
        <body id="body">
    <div id="links">
    <a href="">sdsad</a>
    <a href="">sdsad</a>
    <a href="">sdsad</a>
    </div>
    <div id="box" style="display:none"></div>
    <div id="float">浮动层</div>
    <div id="con">
    <a href=""></a>
    <a href=""></a>
    <a href=""></a>
    </div>
            <script type="text/javascript">
                var $ = function(id){
                    return document.getElementById(id)
                }
    $("links").onmouseover = function(e){
    var e = e || window.event;
    var related = e.relatedTarget || e.fromElement;
    if(related != this && !func(related,this)){
    $("box").style.display = "block";
    //console.log("23")
    }
    }
    function func(e,elem){
    var elem = elem.getElementsByTagName("*");
    for(var i=0;i<elem.length; i++){
    if(e == elem[i]){
    return true;
    }
    }
    return false;
    }
    $("links").onmouseout = function(e){
    var e = e || window.event;
    var related = e.relatedTarget || e.fromElement;
    if(related != this && !func(related,this)){
    //console.log("sd")
    $("box").style.display = "none";
    }
    }

            </script>
        </body>
    </html>
      

  15.   

    onmouseout里边,ie用的是event.toElement,别这么粗心好吗,亲