最近项目中要有个鼠标在图片上滚动实现图片放大和缩小的得到功能,隐约的记得好像记得有个 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. CSS样式设置

    转载来自:http://www.imooc.com/article/2067水平居中设置-行内元素 水平居中 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align: ...

  2. 自动更新本地 GIT 仓库

    随着开源软件的兴起,尤其是 GITHUB 的蓬勃发展,很多开源软件都通过 GIT 进行管理,在我的计算机上就一个目录是我关注并使用的开源软件 GIT 本地副本,如何定期更新这些仓库,一个个的更新太累人 ...

  3. 71、Android上对Cookie的读写操作

    Cookie是为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据,在Android中也经常用到,接下来我们介绍Cookie在Android里是如何进行读写的.   Cookie其实就 ...

  4. python 清华镜像pip install

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple

  5. JZOJ.5281【NOIP2017模拟8.15】钦点

    Description

  6. 修改project任务的默认开始时间

    一般情况下,在project新建一个项目之后,在这个项目里每新添加一个任务,它的默认开始时间都是取的本项目的创建时间.但这可能并不是我们所需要的. 其实在这里,project取的默认开始时间都是整个项 ...

  7. 【BZOJ2259】[Oibh]新型计算机 最短路

    [BZOJ2259][Oibh]新型计算机 Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计 ...

  8. 查找xcode6的沙盒地目录

    开/查找xcode6的沙盒地目录   用以下代码 打开沙盒目录 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirec ...

  9. Android 生成keystore,两种方式

    一.eclipse 中生成android keystore 建立任意一个android项目(例如:AntForAndroid) 右键AntForAndroid根目录弹出菜单->Android T ...

  10. [Navicat] 常用快捷键及注意事项

    近来需要同时管理多种类型.多台server的数据库,在经历了各种查询客户端(SSMS, SQLyog, PL/SQL等)的不断切换,ip/user/pwd的反复输入的这种自虐式体验后,实在无法忍受,就 ...