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 相关文章推荐
JavaScript CSS修改学习第六章 拖拽
Feb 19 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
让IE8浏览器支持function.bind()方法
Oct 16 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
原生js实现图片放大缩小计时器效果
Jan 20 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
Vue开发之watch监听数组、对象、变量操作分析
Apr 25 Javascript
JS数组方法slice()用法实例分析
Jan 18 Javascript
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
Canvas跟随鼠标炫彩小球的实现
Apr 11 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
用户的详细注册和判断
2006/10/09 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
jQuery.getScript加载同域JS的代码
2012/02/13 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
python sort、sorted高级排序技巧
2014/11/21 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
python selenium操作cookie的实现
2020/03/18 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
美国第一香水网站:Perfume.com
2017/01/23 全球购物
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
建设投标担保书
2014/05/13 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
优化Mysql查询的示例
2022/04/26 MySQL