码迷,mamicode.com
首页 > Web开发 > 详细

分享一个jquery插件,弥补一下hover事件的小小不足

时间:2014-08-15 20:50:59      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   ar   art   问题   

hover事件有一个缺点:当你的鼠标无意划过一个dom元素(瞬间划过,这个时候用户可能不想触发hover事件),会触发hover事件

应该设置一个时差来控制hover事件的触发

比如jd左边的菜单 你用鼠标瞬间划过他子菜单会弹出然后立即消失, 用户体验非常的不好.

易迅的菜单就没有这个问题

delayHover来解决这个问题

啥也不说了先看调用…………………………

调用方式:

var duration = 500;// 延迟500毫秒

$(‘#div1‘).delayHover(function () {
     $(this).css(‘background‘, ‘#ccc‘);
}, function () {
     $(this).css(‘background‘, ‘#000‘);
}, duration)

duration表示延迟多少时间来触发hover事件

 

实现原理

设置一个定时器来开启hover事件

上代码

$.fn.delayHover = function (fnOver, fnOuter, duration) {
    var _this = this
    var timerOut; //开启hover的定时器
    $(this).hover(function () {
        timerOut = setTimeout(function () {
            fnOver.call(_this);
        }, duration)
    }, function () {
        clearTimeout(timerOut)
        fnOuter.call(_this);;
    })
}

fnOver开启一个定时器

fnOuter关闭定时器

 

bug修复:

1.fnOuter每次都会执行(即使fnOver不执行)

2.duration对传入的值进行安全监测

; (function ($) {

    $.fn.delayHover = function (fnOver, fnOut, duration) {
        var _this = this;
        var timeouter;
        var defaultDuration = 500;//默认500 毫秒
        var fnOver_Running = false;  //函数已经执行

        //重置duration
        if (typeof duration != "number" ||//不是字符串
            isNaN(duration) || //NaN
            duration < 0) { //非法值

            duration = defaultDuration;
        }

        $(_this).hover(function (event) {
            timeouter = setTimeout(function () {
                fnOver_Running = true;
                fnOver.call(_this, event)
            }, duration);
        }, function (event) {
            clearTimeout(timeouter);
            if (fnOver_Running) {
                fnOver_Running = false;
                fnOut.call(_this, event);
            }
        });
        return $(this);
    }

})(jQuery);

 

完整代码

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 
    <style>
        .hover {
            background: #000;
            color: #fff;
        }
    </style>

    <script>
        ; (function ($) {

            $.fn.delayHover = function (fnOver, fnOut, duration) {
                var _this = this;
                var timeouter;
                var defaultDuration = 500;//默认500 毫秒
                var fnOver_Running = false;  //函数已经执行

                //重置duration
                if (typeof duration != "number" ||//不是字符串
                    isNaN(duration) || //NaN
                    duration < 0) { //非法值

                    duration = defaultDuration;
                }

                $(_this).hover(function (event) {
                    timeouter = setTimeout(function () {
                        fnOver_Running = true;
                        fnOver.call(_this, event)
                    }, duration);
                }, function (event) {
                    clearTimeout(timeouter);
                    if (fnOver_Running) {
                        fnOver_Running = false;
                        fnOut.call(_this, event);
                    }
                });
                return $(this);
            }

        })(jQuery);
    </script>


    <script> 
        $(function () {

            $(#hovertest).hover(function () {
                console.log(指向);
                $(this).addClass(hover);
            },
            function () {
                console.log(离开);
                $(this).removeClass(hover);
            });

            $(#delayHover).delayHover(function () {
                console.log(指向);

                $(this).addClass(hover);
            }, function () {
                console.log(离开);
                $(this).removeClass(hover);
            }, 500);
            
            $(#delayHover1).delayHover(function () {
                console.log(指向);
                $(this).addClass(hover);
            }, function () {
                console.log(离开);
                $(this).removeClass(hover);
            }, 3000);            
        })
    </script>

</head>
<body>
    <h1>
        hover事件有一个缺点:不能延时显示<br />
        <i>delayHover</i>解决了这个问题
    </h1>

    <div id="hovertest" style="border:1px solid #ccc;  ">
        这个是hover事件 指向我看看效果
    </div>
    
    <div id="delayHover" style="margin-top:100px;">
        这个是delayHover事件 指向我看看效果  默认值500毫秒
    </div>

    <div id="delayHover1" style="">
        这个是delayHover事件 指向我看看效果 延迟3000毫秒
    </div>
</body>
</html>

欢迎提bug

分享一个jquery插件,弥补一下hover事件的小小不足,布布扣,bubuko.com

分享一个jquery插件,弥补一下hover事件的小小不足

标签:style   blog   http   color   io   ar   art   问题   

原文地址:http://www.cnblogs.com/bestdqf/p/3915570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!