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 iframe编程相关代码
Dec 28 Javascript
jquery动态加载图片数据练习代码
Aug 04 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
从零学JS之你需要了解的几本书
May 19 Javascript
jQuery中delegate()方法用法实例
Jan 19 Javascript
javacript获取当前屏幕大小
Jun 04 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
Jun 24 Javascript
canvas实现探照灯效果
Feb 07 Javascript
3分钟掌握常用的JS操作JSON方法总结
Apr 25 Javascript
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
【js设计模式】SOLID五大设计原则
Mar 24 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
PHP获取文件后缀名的三个函数
2012/10/15 PHP
初识Laravel
2014/10/30 PHP
php简单获取目录列表的方法
2015/03/24 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
python ansible服务及剧本编写
2017/12/29 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android