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

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

时间: 2024-10-12 20:47:53

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

分享一个jquery功能强大的提示信息插件代码

代码属于提示文字特效,很好,使用有些复杂,请参demo使用 下载地址:jquery功能强大的提示信息插件代码 预览DEMO:DEMO 分享一个jquery功能强大的提示信息插件代码,布布扣,bubuko.com

你真的需要一个jQuery插件吗

jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错误的时间比实际从头 开始编写组件的时间还长. 幸运的是,人们通常具有各种不同的插件可供选择.但是,即使你只用一个,也要弄清楚它是否值得使用的.永远不要在你的代码库中引入错误的代码. 你需要一个插件吗? 首先是要弄清楚究竟你是否需要一个插件.如果不需要,既可以节省文件大小,又可以节省自己的时间. 1.

如何开发一个Jquery插件?

最近有离职的想法,可这不是重点,重点是很多面试官都会问的一个问题就是:怎么开发一个jquery插件. 其实,如果是在真实的工作中遇到这种情况,我会直接找一个简单的jquery插件,例如jquery.cookie.js或者jquery.textchange.js插件,jquery的插件那么多,你随便找来一个都是可以用的,我们需要做的就是把jquery的架子留下来,把具体的功能实现换成自己的,然后就可以到处去使用了. 但是,面试中我们是万万不能这么回答的,所以,一方面是为了让自己再熟悉一下jquer

做了一个jquery插件,使表格的标题列可左右拉伸

示例下载 插件名称命名为:jquery.tableresize.js,代码如下: /* Writen by mlcactus, 2014-11-24 这是我封装的一个jquery插件,能够使table的各列可以左右拉伸,从而使宽度变小或变大 用法: 单个table:$("#table_id").tableresize(); 页面所有table:$("table").tableresize(); */ (function ($) { $.fn.tableresize

分享一个JQuery弹出层插件

JQuery插件TipsWindown 1.1 一个基于jQuery的弹出层.支持拖拽,支持内容为文字,图片,URL等!至于兼容性.在IE6下,弹出对像无法绝对固定.其他应该没啥大问题: 最新更新:(2010-08-12):修正IE6下不能遮住下拉菜单的BUG,增加拖动时半透明效果.句容市鄂茂钢铁 应用演示 弹出文本信息提示:   我是下拉菜单 tipsWindown("提示","text:提示信息内容","250","150"

开发一个jQuery插件——多级联动菜单

引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页面都有引用jQuery,,开发个jQuery联动菜单插件,说动手就动手,下面跟大家分享分享. 我用的jQuery插件方式 (function($){ $.fn.casmenu=function(argvs){ //your code } })(jQuery); 其中jQuery传入的是jquery对

自己在项目中写的一个Jquery插件和Jquery tab 功能

后台查询结果 PDFSearchResult实体类: [DataContract(Name = "PDFSearchResult")] public class PDFSearchResult { public PDFSearchResult(string title, string fileUrl) { Title = title; FileUrl = fileUrl; } [DataMember(Name = "title")] public string Ti

如何去定义一个jquery插件

扩展jquery的时候.最核心的方法是以下两种: $.extend(object) 可以理解为jquery添加一个静态方法 $.fn.extend(object) 可以理解为jquery实例添加一个方法 $.extend(object) 例子: 1 2 3 4 5 6 7 /* $.extend 定义与调用 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ $.extend({ f

个人第一个jquery插件(tips)

js代码 /** * Created by joesbell on 2016/10/8. */ ;(function($) { var defaults = { background:"#000",//tips的背景颜色 color:"white", position:"r",//出现的位置 l--左边, r--右边 t--顶部 b--底部 parWidth:"",//父级元素的宽度 parHeight:""