• 用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的几个作用域的特性的- -好久没接触突然遇到 心跳了一下、

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

  • 相关阅读:
    cpuset
    top
    path-lookup
    strace
    IDR算法[原理]
    cgroup
    转载
    std::reverse_iterator::base
    可重入、不可重入
    chromium code 中 普遍使用的 C++11 语法
  • 原文地址:https://www.cnblogs.com/lizhug/p/3134897.html
Copyright © 2020-2023  润新知