最近项目中要有个鼠标在图片上滚动实现图片放大和缩小的得到功能,隐约的记得好像记得有个 mousewheel 事件,可以实现需求,于是乎,开始在网上查找这一方法,但是,出乎意料的结果,各浏览器对此方法有着不同的实现方式,当时我就呵呵啦...
这下麻烦啦,于是又在网上查了些许资料,基本上都是大同小异,大概的思路都是根据firefox的DOMMouseScroll事件 和 其它浏览器的onmousewheel事件来实现 自定义mousewheel事件,其实前辈们留下来的 基本上也可以拿来用啦,可是鬼使神差的不知怎么的这次就非要叫个针,非要自己实现一下试试,而且本人比较擅长 jquery, 所以有了想用 $.fn.extend 扩展一个 mousewheel事件的想法,所以就开启了下边的自定义 jquery 扩展 mousewheel事件之旅。

  其实呢,现在有个比较成熟的 jquery.mousewheel.js 插件,发现好多用到鼠标滚轮轮动效果的网站都用了这个插件,兼容性也挺高的,所以如果网站建设对加载文件数量不在意的话完全可以使用此插件:

  下载地址:

    https://github.com/jquery/jquery-mousewheel
    http://plugins.jquery.com/mousewheel/
    原谅我网速不好 以上两个地址 我都没访问到, 吼吼....

    http://www.jq22.com/jquery-info805(最后再此站点 下载了个应用 jquery.mousewheel.js 的 Demo,其中有 我们需要的插件哦:))

  细读了两边jquery.mousewheel.js源码,了解到,它是用 $.event.special 从 HTMLElement层级 进行的添加,可是这并不是我想要的,不能忘了自己最初的目的(我只是想要一个枣尝尝,并没有想要一颗枣树...)

  

好了不说了,开始正题,原谅我一说就容易刹不住车....

  首先,计划个思路,分个 1,2, 3,4..... 步..

  step1: 遍读网络博客了解各浏览器所支持的 鼠标滚动 事件,以便了解兼容性的不同

  涨姿势:

      主要区别在于 firefox 和 其它浏览器的区别:firefox支持DOMMouseScroll, 而 其它浏览器支持mousewheel。

      可是看了 jquery.mousewheel.js源码后,发现 貌似还有Browser 或是 同种Browser不同版本号, 支持的方式也是不一样,所以有又有了 wheel 和 MozMousePixelScroll(这个一看就是firefox支持的) 这两个事件,具体没有研究,如果对这方面有造诣的同仁们,欢迎留言,讨论交流。

  思路:

      1.把各浏览器对mousewheel支持的事件,组成数组,以便之后的事件监听

      2.将不同的mousewheel事件,进行事件监听(根据涨姿势 阶段了解到,主要是要处理firefox下的事件监听)

  所以有了下边的这段,参考 jquery.mousewheel.js 插件,并有些小改动的代码,如下:  

     $.fn.extend({
mousewheel: function(){
var toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? //documentMode属性返回浏览器渲染当前文档所用的模式
['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
var el = this[0]; //this[0]; jquery对象 转 JS对象(因addEventListener是JS对象的监听事件)
if( el.addEventListener ){
for( var i = toBind.length; i; ){
el.addEventListener(toBind[--i],handleFun,false);
}
}
else {
el.onmousewheel = handleFun;
}
});

  

  step2: 对监听事件 中的事件处理函数进行设计,目的:得到 滚轮 的滑动方向(这点很重要哦,每一步都要明确知道我们要干什么)

  涨姿势:

      经过对defferent browers 测试,得到可以用来判断 滚轮滚动方向的属性,经测试 主要在 wheelDelta、wheelDeltaY 和 deltaY 三个属性上面有些文章(在step1阶段了解到还和detail属性有关,然而在自测阶段,发现 然并卵... detail=0 没有变过,可能是我用测浏览器版本问题,如果对这方面有造诣的同仁们,欢迎留言,讨论交流)。

      测试结果:

      

  思路:

      1.根据测试得到的结果,用滑动鼠标的滚轮以上各个属性的值的符号来确定 滚轮的滑动方向

     2.确定目标:向上滚动--> 1, 向下滚动--> -1

  思路已有,start coding.....

                 //deal with the mousewheel
function handleFun(e){
var driect = 0, delta=0; //driect:滚动方向 delta:各浏览器监听滚动事件的属性值
var e = e || window.event;
if ( e.wheelDelta ){ delta = e.wheelDelta }
else if ( e.deltaY ){ delta = e.deltaY * -1 }
else if( e.wheelDeltaY ) { delta = e.wheelDeltaY }
else {
console.log('get delta,have somethings wrong...');
}
delta==0 ? console.log('get delta,have somethings wrong...') :
delta>0 ? driect=1 : driect=-1; typeof fn==='function' ? fn( $(el) ,driect ) : '';
}

综合step1 和 step2, 完整写法:

         $.fn.extend({
mousewheel: function( fn ){
//judge the brower's mousewheel event, bind the event to element
var toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'];
var el = this[0]; //this[0]; jquery对象 转 JS对象(因addEventListener是JS对象的监听事件)
if( el.addEventListener ){
for( var i = toBind.length; i; ){
el.addEventListener(toBind[--i],handleFun,false);
}
}
else {
el.onmousewheel = handleFun;
} //deal with the mousewheel
function handleFun(e){
var driect = 0, delta=0; //driect:滚动方向 delta:各浏览器监听滚动事件的属性值
var e = e || window.event;
if ( e.wheelDelta ){ delta = e.wheelDelta }
else if ( e.deltaY ){ delta = e.deltaY * -1 }
else if( e.wheelDeltaY ) { delta = e.wheelDeltaY }
else {
console.log('get delta,have somethings wrong...');
}
delta==0 ? console.log('get delta,have somethings wrong...') :
delta>0 ? driect=1 : driect=-1; typeof fn==='function' ? fn( $(el) ,driect ) : '';
}
} });

应用:

 $('div').mousewheel(function(dir){
console.log( dir );
});

结果:

ok! 成功!! 至于开始提到的 滑动鼠标,图片的放大缩小功能实现在 《自定义mousewheel事件,实现图片放大缩小功能实现》中是讲述。

jquery扩展鼠标mousewheel事件的更多相关文章

  1. JQuery的鼠标滚动事件

    jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...

  2. 转载JQuery绑定鼠标粘贴事件工具类

    // 粘贴事件监控 $.fn.pasteEvents = function( delay ) { if (delay == undefined) delay = 10; return $(this). ...

  3. 鼠标滚轮事件MouseWheel

    其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+,Chrome)中,都提供了 "mousewheel" 事件.但杯具的是 Firefox ...

  4. jQuery之jQuery扩展和事件

    一.jQuery事件 常用事件 blur([[data],fn]) 失去焦点 focus([[data],fn]) 获取焦点( 搜索框例子) change([[data],fn]) 当select下拉 ...

  5. JQuery扩展和事件

    一.jQuery事件 常用事件 blur([[data],fn]) 失去焦点 focus([[data],fn]) 获取焦点( 搜索框例子) change([[data],fn]) 当select下拉 ...

  6. 前端之JQuery:JQuery扩展和事件

    jQuery之jQuery扩展和事件 一.jQuery事件 常用事件 blur([[data],fn]) 失去焦点 focus([[data],fn]) 获取焦点( 搜索框例子) change([[d ...

  7. jQuery的鼠标事件总结

    jQuery的鼠标事件总结 1.click()事件. 2.dbclick()鼠标双击事件 3.mousedown()鼠标按下事件 4.mouseup()鼠标松开事件 5.mouseover()从一个元 ...

  8. jQuery禁用、开启鼠标滚轮事件

    1.禁用鼠标滚轮事件 $(document).bind('mousewheel', function(event, delta) {return false;}); 2.开启鼠标滚轮事件,直接解绑事件 ...

  9. jQuery学习-鼠标事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. Adversarial Training

    原于2018年1月在实验室组会上做的分享,今天分享给大家,希望对大家科研有所帮助. 今天给大家分享一下对抗训练(Adversarial Training,AT). 为何要选择这个主题呢? 我们从上图的 ...

  2. Java释出的时候,AWT作为Java最弱的组件受到不小的批评

    Java释出的时候,AWT作为Java最弱的组件受到不小的批评. 最根本的缺点是AWT在原生的用户界面之上仅提供了一个非常薄的抽象层. 例如,生成一个AWT的 复选框会导致AWT直接调用下层原生例程来 ...

  3. sql server数据库数据查询成功

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  4. hdu 5078

    Osu! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Sub ...

  5. 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法

    [BZOJ4385][POI2015]Wilcze doły Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段 ...

  6. SpringMVC如何接收json数据

    请求头:Content-Type=application/json数据如: {"mobile":"12345678912","smsContent&q ...

  7. mfc 对话框程序 托盘实现

    1 在头文件里面定义 消息 #define WM_SHOWTASK WM_USER+10 在主窗口类里面定义 一个变量 两个函数 a 变量 托盘结构体的变量 NOTIFYICONDATA m_nid; ...

  8. python类的相关知识第二部分

    类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...

  9. 解决 apt-get the following packages has unmet dependencies 问题

    安装vpn遇到以下问题: 显示flinux print util和openconnect存在依赖库的冲突 此时尝试安装新的tk.vpnc-scripts.libopenconnect5,尝试apt-g ...

  10. mysql乐观锁总结和实践(转)

    原文:mysql乐观锁总结和实践 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的 ...