在做一个网站、用到了这个。
通常网站是为了防止用户鼠标无意划过菜单、导致子菜单显示出来。其实用户在菜单上停留一段时间才代表用户要看那个子菜单。无意划过的时候不需要显示子菜单。所以这边就需要来一个 鼠标停留一段时间以上才执行显示子菜单的动作。
这个在很多网站上都有用
比如京东淘宝、在用户鼠标快速经过的时候并不会显示二级菜单或者切换panel
自己本来想用jquery的delay函数的、但是想到delay函数只是延迟而已、用户鼠标移开的时候、过一段时间还是会执行那个显示操作、所以应该在用户离开元素的时候把计时的参数清除掉。所以这边就用了纯纯的javascript的setTimeout来实现
1 /********************右侧面板切换*************/ 2 var t; //时间变量 3 4 var panelChange = function(){ 5 6 7 //匿名函数传递参数 8 (function(obj){ 9 return t = setTimeout(function(){ 10 var num = obj.attr("class").split("-")[2]; 11 $.each($(".panel-guide span"), function(){ 12 $(this).removeClass("selected"); 13 }); 14 15 obj.addClass("selected"); 16 17 $.each($(".panel-bd div"), function(){ 18 if ($(this).attr("class") == "panel-detail-" + num){ 19 $(this).css("display", "block"); 20 } else { 21 $(this).css("display", "none"); 22 } 23 }); 24 }, 200); 25 }($(this))); 26 27 28 }; 29 30 $.each($(".panel-guide span"), function(){ 31 $(this).bind({ 32 "mouseover": panelChange, 33 "mouseout": function(){ 34 clearTimeout(t); 35 } 36 }); 37 }); 38 39 /***************切换end*****************/
代码简单的、如果用户鼠标进入DOM就开始计时、如果离开了就清除计时、然后动作也就不会执行了。
这边需要注意一点的是= =你看见上面有个匿名函数了么、我本来被坑了、
setTimeout 是在全局window变量的函数、我里面有一个obj用到的是panelChange里面的$(this) 所以这边因为作用域的问题导致 $(this).addClass("selected") 失效
所以要用匿名函数把变量传进去、利用闭包来实现正确的传参..... 突然又想复习一下this的几个作用域的特性的- -好久没接触突然遇到 心跳了一下、
不知道改变作用域的方式能不能写成功- -希望有经验的童鞋能指导一下其他方法来实现这个....