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如何使用bind指定接收者
May 04 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
May 07 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
浅谈js中StringBuffer类的实现方法及使用
Sep 02 Javascript
手动初始化Angular的模块与控制器
Dec 26 Javascript
详解前后端分离之VueJS前端
May 24 Javascript
js实时监控文本框输入字数的实例代码
Jan 18 Javascript
vue 修改 data 数据问题并实时显示的方法
Aug 27 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 Javascript
VUE项目初建和常见问题总结
Sep 12 Javascript
vue通过过滤器实现数据格式化
Jul 20 Javascript
vue.js+element 默认提示中英文操作
Nov 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
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
css配合jquery美化 select
2013/11/29 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
javascript中this的四种用法
2015/05/11 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python中int()函数的用法浅析
2017/10/17 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
python编写简单端口扫描器
2019/09/04 Python
python设置环境变量的作用整理
2020/02/17 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
python palywright库基本使用
2021/01/21 Python
保时捷设计:Porsche Design
2019/03/30 全球购物
小学教师岗位职责
2013/11/25 职场文书
竞争上岗实施方案
2014/03/21 职场文书
班级旅游计划书
2014/05/03 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
2014年党支部学习材料
2014/05/19 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
中考学习决心书
2015/02/04 职场文书
婚育证明样本
2015/06/16 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python