资讯专栏INFORMATION COLUMN

jQuery:hover延时效果的一些处理

yunhao / 1586人阅读

摘要:比如,让鼠标在元素上停留规定时间内才触发事件。改进部分保存当前上下文的对象调用替换改完以后我自己的小项目都用这个方法来处理或者其他的延时效果了。

一开始鼠标的hover事件我都会用css:hover伪类来实现,它的特点也很明显,就是无延时立即触发,但有时可能会造成一些干扰,想要用户体验更好的话就要用js。
比如,让鼠标在元素上停留规定时间内才触发hover事件。我在一篇博文上找到一段比较好的处理代码 :
文章出处

(function($){
    $.fn.hoverDelay = function(options){
        var defaults = {
            // 鼠标经过的延时时间
            hoverDuring: 200,
            // 鼠标移出的延时时间
            outDuring: 200,
            // 鼠标经过执行的方法
            hoverEvent: function(){
                // 设置为空函数,绑定的时候由使用者定义
                $.noop();
            },
            // 鼠标移出执行的方法
            outEvent: function(){
                $.noop();    
            }
        };
        var sets = $.extend(defaults,options || {});
        var hoverTimer, outTimer;
        return $(this).each(function(){
            $(this).hover(function(){
                // 清除定时器
                clearTimeout(outTimer);
                hoverTimer = setTimeout(sets.hoverEvent,
                    sets.hoverDuring);
                }, function(){
                    clearTimeout(hoverTimer);
                    outTimer = setTimeout(sets.outEvent,
                        sets.outDuring);
                });    
            });
    }      
})(jQuery);
    
// 具体使用,给id为“#test”的元素添加hoverEvent事件
$("#test").hoverDelay({
    // 自定义,outEvent同
    hoverEvent: function(){
        alert("经过我!");
    }
});

这段代码好在于把鼠标经过事件和延时分离出来,延时以及延迟的清除都交由hoverDelay来处理,具体hover事件自己自定,是一段能够很通用的代码。
但运用起来还有些小问题,在自定义hoverEvent、outEvent中使用this的话,它所指向的是window这个对象,而不是当前上下文,所以我改进了下,通过apply()来实现this绑定。
改进部分:

return $(this).each(function(){
        // 保存当前上下文的this对象
        var $this = $(this)
        $this.hover(function(){
            clearTimeout(outTimer);
            hoverTimer = setTimeout(function () {
                // 调用替换
                sets.hoverEvent.apply($this);
            }, sets.hoverDuring);
        }, function(){
            clearTimeout(hoverTimer);
            outTimer = setTimeout(function () {
                sets.outEvent.apply($this);
            }, sets.outDuring);
        });
    });

改完以后我自己的小项目都用这个方法来处理hover或者其他的延时效果了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91255.html

相关文章

  • CSS transition delay简介与进阶应用

    摘要:用来定义元素两种状态之间的过渡。到目前为止,我们利用完全模拟了第一部分我们使用实现的功能,而且看上去更简洁。附上利用来实现该方案的代码用于参考。由于代码效果时好时坏,猜测可能与的容器相关。 背景 在日常的项目开发中,我们会很经常的遇见如下的需求: 在浏览器页面中,当鼠标移动到某个部分后,另一个部分在延迟若干时间后出现 在鼠标移除该区域后,另一部分也在延迟若干时间后消失 我相信这是一...

    e10101 评论0 收藏0
  • JavaScript 节流函数 throttle 详解

    摘要:后续的一些辅助性优化读者可以自己琢磨,如函数指向,返回值保存等。 原文:https://keelii.github.io/2016/06/11/javascript-throttle/ 在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发。比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove)。也就是说用户在触发这些浏览...

    instein 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<