• 用setTimeout实现在DOM上(通常是菜单栏)鼠标停留一段时间才执行相应的操作


    在做一个网站、用到了这个。

    通常网站是为了防止用户鼠标无意划过菜单、导致子菜单显示出来。其实用户在菜单上停留一段时间才代表用户要看那个子菜单。无意划过的时候不需要显示子菜单。所以这边就需要来一个 鼠标停留一段时间以上才执行显示子菜单的动作。

    这个在很多网站上都有用

    比如京东淘宝、在用户鼠标快速经过的时候并不会显示二级菜单或者切换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的几个作用域的特性的- -好久没接触突然遇到 心跳了一下、

    不知道改变作用域的方式能不能写成功- -希望有经验的童鞋能指导一下其他方法来实现这个....

  • 相关阅读:
    剑指offer-面试题59_2-队列的最大值-队列
    剑指offer-面试题59_1-滑动窗口的最大值-数组
    剑指offer-面试题64-求1+2+...+n-发散思维
    客车网上售票系统之前台订票、退票、改签管理和前台留言管理
    客车网上售票系统之票务管理
    客车网上售票系统项目之留言管理和新闻管理
    客车网上售票系统之用户管理
    客车网上销售系统需求分析及项目燃尽图
    MyBatis-plus逻辑删除
    项目启动注释模板
  • 原文地址:https://www.cnblogs.com/lizhug/p/3134897.html
Copyright © 2020-2023  润新知