现有解决方案
此帖子和other stackoverflow article 可能有 3 个解决方案。
解决方案 1
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('up 1');
}
else {
console.log('down 1');
}
lastScrollTop = st;
});
解决方案 2
$('body').on('DOMMouseScroll', function(e){
if(e.originalEvent.detail < 0) {
console.log('up 2');
}
else {
console.log('down 2');
}
});
解决方案 3
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('up 3');
}
else {
console.log('down 3');
}
});
多浏览器测试
我无法在 Safari 上测试它
铬 42 (Win 7)
- 解决方案 1
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
- 解决方案 2
- 解决方案 3
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
火狐 37 (Win 7)
- 解决方案 1
- 向上:每 1 个滚动条 20 个事件
- 向下:每 1 个滚动 20 个事件
- 解决方案 2
- 解决方案 3
IE 11 (Win 8)
- 解决方案 1
- 向上:每 1 次滚动 10 个事件(副作用:最后发生向下滚动)
- 向下:每 1 个滚动条 10 个事件
- 解决方案 2
- 解决方案 3
IE 10 (Win 7)
- 解决方案 1
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
- 解决方案 2
- 解决方案 3
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
IE 9 (Win 7)
- 解决方案 1
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
- 解决方案 2
- 解决方案 3
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 个滚动 1 个事件
IE 8 (Win 7)
- 解决方案 1
- 向上:每 1 次滚动 2 个事件(副作用:最后发生向下滚动)
- 向下:每 1 个滚动 2~4 个事件
- 解决方案 2
- 解决方案 3
- 向上:每 1 次滚动 1 个事件
- 向下:每 1 次滚动 1 个事件
组合解决方案
我检查了 IE 11 和 IE 8 的副作用来自 if else 语句。因此,我将其替换为if else if 语句,如下所示。
在多浏览器测试中,我决定将Solution 3用于普通浏览器,Solution 1用于firefox和IE 11。
我推荐 this answer 检测 IE 11。
// Detect IE version
var iev=0;
var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var rv=navigator.userAgent.indexOf("rv:11.0");
if (ieold) iev=new Number(RegExp.$1);
if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
if (trident&&rv!=-1) iev=11;
// Firefox or IE 11
if(typeof InstallTrigger !== 'undefined' || iev == 11) {
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('Up');
}
else if(st > lastScrollTop) {
console.log('Down');
}
lastScrollTop = st;
});
}
// Other browsers
else {
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('Up');
}
else if(e.originalEvent.wheelDelta < 0) {
console.log('Down');
}
});
}