js onmousewheel事件多次触发问题解决方法


Posted in Javascript onOctober 17, 2014

我想做一个首屏和第二屏之间滚动鼠标滚轮就可以整平切换的效果,遇到了很多问题,后来在kk的帮助下,终于解决了这个问题,甚是欢喜,于是记录一下:

我最初的代码是这样的:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<style>
div {
width: 700px;
height: 1000px;
}
.red {
background-color: red;
}
.yellow {
background-color: yellow;
}
</style>
</head>
<body>
<div class="red"> </div>
<div class="yellow"> </div>
<div class="red"> </div>
<div class="yellow"> </div>
<div class="red"> </div>
</body>

<script src="../jQuery/jquery.min.js"></script>
<script src="test.js"></script>
</html>
$(document).ready(function(){
var height = $(window).height(); //获取浏览器窗口当前可见区域的大小

//鼠标滚动之后整屏切换
var scrollFunc = function(e){
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
e = e || window.event;
if((e.wheelDelta<0|| e.detail>0) && scrollTop>=0 && scrollTop<height){ //不同浏览器向下滚动 
$(document.body).animate({scrollTop:height}, "fast");
$(document.documentElement).animate({scrollTop:height}, "fast");
}else if((e.wheelDelta>0 || e.detail<0) && scrollTop>=height && scrollTop<=height+20){ //不同浏览器向上滚动
$(document.body).animate({scrollTop:0}, "fast");
$(document.documentElement).animate({scrollTop:0}, "fast");
}
};


//注册事件
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',scrollFunc,false);
}
window.onmousewheel = document.onmousewheel = scrollFunc; //IE、chrome、safira
});

这样的代码我在IE和火狐下测试都是正常的,但是在谷歌下onmousewheel事件总是会触发多次,这是一个极其恼人的事情,为什么会多次触发呢?经过调试,我发现是我们每次滚动鼠标时都是很“凶残”的一下子滚动很大一个幅度,而不是一小格一小格的慢慢滚动,这就导致了滚动的时候会多次触发onmousewheel事件,调用scrollFunc函数,在函数内的animate函数没有执行完的时候还是不断的被调用,这样就会出现滚动多次滚动条滚不下来页滚不上去的情况。于是,我将上面的js代码改成了下面这样:

$(document).ready(function(){
var height = $(window).height();
var scrollFunc = function(e){
document.onmousewheel = undefined;
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
e = e || window.event;
if((e.wheelDelta<0|| e.detail>0) && scrollTop>=0 && scrollTop<height){ 
$(document.body).animate({scrollTop:height}, "fast","linear",function(){
document.onmousewheel = scrollFunc;
});
$(document.documentElement).animate({scrollTop:height}, "fast","linear",function(){
document.onmousewheel = scrollFunc;
});
}else if((e.wheelDelta>0 || e.detail<0) && scrollTop>=height && scrollTop<=height+20){
$(document.body).animate({scrollTop:0}, "fast","linear",function(){
document.onmousewheel = scrollFunc;
});
$(document.documentElement).animate({scrollTop:0}, "fast","linear",function(){
document.onmousewheel = scrollFunc;
});
}
};
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',scrollFunc,false);
}
document.onmousewheel = scrollFunc;
});

好了,现在的代码已经能够正常运行了,不过由于我是一只菜鸟,代码写的不够精致,又被kk说了,在他的提示下,我将冗余的代码又进行了一番修改:

$(document).ready(function(){
var height = $(window).height();
var width = $(window).width();
var body;
if(navigator.userAgent.indexOf("Firefox")>0 || navigator.userAgent.indexOf("MSIE")>0){
body = document.documentElement;
}else{
body = document.body;
}
var isFinish = true;
var scrollFunc = function(e){
if(isFinish){
var scrollTop = body.scrollTop;
e = e || window.event;
if((e.wheelDelta<0|| e.detail>0) && scrollTop>=0 && scrollTop<height-20){ 
scroll(height);
}else if((e.wheelDelta>0 || e.detail<0) && scrollTop>=height && scrollTop<=height+20){
scroll(0);
}
}

};
var scroll = function(height){
isFinish = false;
$(body).animate({scrollTop:height},"fast","linear",function(){
isFinish = true;
});
};
if(navigator.userAgent.indexOf("Firefox")>0){
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',scrollFunc,false);
}
}else{
document.onmousewheel = scrollFunc;
}
});

终于得到简介的代码了,不得不说,通过解决这个问题,还是学到很多的。以后要向着“write less, do more”的目标更加努力了!!!

如果有哪里写的不对的,欢迎各位大神们指教,我会虚心学习的。

Javascript 相关文章推荐
List all the Databases on a SQL Server
Jun 21 Javascript
不同浏览器的怪癖小结
Jul 11 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 Javascript
Javascript 遮罩层和加载效果代码
Aug 01 Javascript
jQuery+json实现的简易Ajax调用实例
Dec 14 Javascript
RequireJs的使用详解
Feb 19 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
JavaScript正则表达式简单实用实例
Jun 23 Javascript
基于JavaScript实现报警器提示音效果
Oct 27 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
详解VUE前端按钮权限控制
Apr 26 Javascript
Javascript var变量删除原理及实现
Aug 26 Javascript
js实现飞入星星特效代码
Oct 17 #Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
Oct 17 #Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
Oct 17 #Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 #Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
Oct 17 #Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
Oct 17 #Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 #Javascript
You might like
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php数组去除空值函数分享
2015/02/02 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
javascript的BOM
2016/05/03 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python面试题小结附答案实例代码
2019/04/11 Python
Django 框架模型操作入门教程
2019/11/05 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
python操作yaml说明
2020/04/08 Python
通过案例解析python鸭子类型相关原理
2020/10/10 Python
小学生检讨书大全
2014/02/06 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
小学运动会报道稿
2014/10/04 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python