JavaScript滚轮事件兼容性写法
kart
8年前
<p>研究滚轮事件是因为在做一个翻版的fullpage.js,需要通过监听滚轮事件进行翻页。在实现过程中遇到了一些兼容性问题处理。所以顺便封装了个方法wheel(upFn, downFn),方便日后调用。</p> <p>但W3C并没有对鼠标滚轮事件进行规范,各浏览器厂商封装了不同的实现方法,事件属性也不一样,号称最标准的FireFox,用了一个私有实现DOMMouseScroll。不过,其他浏览器都是用onmousewheel实现,所以做兼容处理的难度也不大。</p> <table> <thead> <tr> <th>浏览器</th> <th>实现方法</th> <th>事件属性</th> <th>向上滚动</th> <th>向下滚动</th> </tr> </thead> <tbody> <tr> <td>FireFox</td> <td>DOMMouseScroll</td> <td>detail</td> <td>-3的倍数</td> <td>3的倍数</td> </tr> <tr> <td>非FireFox</td> <td>onmousewheel</td> <td>wheelDelta</td> <td>120的倍数</td> <td>-120的倍数</td> </tr> </tbody> </table> <p>在FireFox下,DOMMouseScroll必须通过addEventListener来绑定,如:<br> element.addEventListener("DOMMouseScroll",func,false) ;</p> <p>在非FireFox下,就没有限制了,除了addEventListener方法,还可用下边的代码:<br> element.onmousewheel=function(){};</p> <p>封装代码如下:</p> <pre> <code class="language-javascript">// 滚轮响应事件 // 参数:type有两个属性值,分别为"up"(滚轮向上)和"down"(滚轮向下) function wheel(upFn, downFn) { // IE6 window.onmousewheel = getWheelDalta; // Firefox if(window.addEventListener) { window.addEventListener("DOMMouseScroll", getWheelDalta, false); } // 获得鼠标滚轮事件 function getWheelDalta(event) { var event = event || window.event; var delta = 0; // delta的返回值为正时,表示向前滚动;delta的返回值为负时,表示向后滚动; if (event.wheelDelta) { // IE中,鼠标滚轮信息存放在wheelDelta属性中;向前滚动时,wheelDelta的值是120的倍数;向后滚动时,wheelDelta的值是-120的倍数; delta = event.wheelDelta/120; if (window.opera) delta = -delta; } else if (event.detail) { // Firefox的鼠标滚轮信息存放在detail属性中;向前滚动,detail的值是-3的倍数;向后滚动,detail的值是3的倍数; delta = -event.detail/3; } // 执行滚轮事件函数 if(delta > 0) { upFn(); }else { downFn(); } // 阻止默认行为,防止当页面本身就存在滚动条时出现的异常 prevent(event); function prevent(evt){ if(evt.preventDefault){ evt.preventDefault(); }else{ evt.returnValue = false; } } } } </code></pre> <p>测试调用:</p> <pre> <code class="language-javascript">function wheelUp() { alert("wheelUp"); } function wheelDown() { alert("wheelDown"); } wheel(wheelUp, wheelDown); </code></pre> <p>来自:http://www.dengzhr.com/js/440 </p>