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中的Hoisting机制
Aug 12 Javascript
JS实现光滑展开合拢的菜单效果代码
Sep 16 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
Sep 19 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
Jul 13 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
Mar 21 Javascript
如何在vue里添加好看的lottie动画
Aug 02 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
Jan 22 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
Oct 27 Javascript
Nuxt的路由动画效果案例
Nov 06 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
php生成excel列序号代码实例
2013/12/24 PHP
php文件读取方法实例分析
2015/06/20 PHP
php给图片加文字水印
2015/07/31 PHP
php-app开发接口加密详解
2018/04/18 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python实现爬取逐浪小说的方法
2015/07/07 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
python常用排序算法的实现代码
2019/11/08 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
物业客服专员岗位职责
2013/11/30 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
单位同意报考证明
2015/06/17 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python