禁用预测滚动 - 鼠标滚轮 (OnScroll) 事件触发过于频繁(触摸板)
Disable Predictive Scrolling - Mousewheel (OnScroll) Event fires too often (Touchpad)
我正在执行Javascript onScroll
.我的代码适用于任何普通的计算机鼠标,但是当我使用笔记本电脑的触摸板时,我遇到以下情况:
- 我的鼠标在手指移动滚轮时触发(大约 1 到 8
mousewheel
事件。 - 当两根手指触摸键盘时,我的触摸板会触发更多(~60)
mousewheel
事件,并在我的手指再次悬空后继续触发。
我从移动触摸设备上知道这种行为。该功能称为"预测触摸" - 如果您的手指移动在抬起之前有足够的加速度,滚动将继续。
我认为触摸板驱动程序正在设置这种"平滑滚动"行为。
为了调试这种情况,我使用了以下代码:
/* Handle Mouse-Wheel Scrolling */
var lastChange = +new Date();
$(window).bind('mousewheel', function(e){
console.log("mw");
if(+new Date() - lastChange > 1000){
console.log("mw allowed");
if(e.originalEvent.wheelDelta > 0) {/*go to previous*/}
else{ /*go to next*/}
lastChange = +new Date();
}
return false;});
这是一个简单的代码,每秒"允许"一个鼠标滚动事件。
如果我进行快速触摸板滚动,mousewheel
事件会触发~300次。一秒钟的条件是让 3 个事件发生。我的手指在触摸板上停留的时间远远不到一秒钟。
通过这个测试,我发现即使我的手指已经离开触摸板,mousewheel
事件仍然被触发(几乎连续 3 秒)。
是否有Javascript函数或解决方法/技巧/黑客来避免此行为?
也许是触摸板的onTouchEnd
活动?
要实现这一点,你必须区分鼠标滚动事件和触摸板事件,这在用JavaScript上还是不可能的。已经有人问到如何捕获触摸板输入。
指针事件当前处于编辑器草稿状态,尚不受任何浏览器支持。另请参阅 MDN 上的触摸事件文档。
编辑:这似乎不适用于触控板。一旦它们得到广泛支持,就可以使用触摸事件(特别是触摸结束事件)来实现。通过跟踪手指何时离开触控板,您可以防止页面在该特定点滚动。
https://jsfiddle.net/gLkkb5z0/3/
(function(){
var special = jQuery.event.special,
uid1 = 'D' + (+new Date()),
uid2 = 'D' + (+new Date() + 1);
special.scrollstart = {
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
} else {
evt.type = 'scrollstart';
jQuery.event.handle.apply(_self, _args);
}
timer = setTimeout( function(){
timer = null;
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid1, handler);
},
teardown: function(){
jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
}
};
special.scrollstop = {
latency: 300,
setup: function() {
var timer,
handler = function(evt) {
var _self = this,
_args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout( function(){
timer = null;
evt.type = 'scrollstop';
jQuery.event.handle.apply(_self, _args);
}, special.scrollstop.latency);
};
jQuery(this).bind('scroll', handler).data(uid2, handler);
},
teardown: function() {
jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
}
};
})();
演示
取自 http://james.padolsey.com/javascript/special-scroll-events-for-jquery/
相关文章:
- 将jQuery事件应用于所有类元素
- Jquery事件处理程序仅适用于匿名函数
- 检测演示者工具的事件,类似于onmousedown
- 在将绑定应用于控制器之后,是否会发出Angular$scope事件
- jQuery点击事件仅适用于横向(iPhone)
- Turbolinks等效于window.load的事件
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 如何使用javascript检查事件是否应用于元素
- 在事件处理中,将内容脚本优先于本地脚本
- e.stopPropogation() 等效于点击事件的捕获阶段
- 试图使一个事件依赖于另一个事件,并使用jquery自定义事件传递数据
- 如何使鼠标事件仅适用于外部DIV
- 将stopImmediatePropagation()应用于所有jQuery移动事件
- 如何防止我的$('form').submit(函数(事件))应用于某些表单
- 将jQuery事件函数应用于新的Knockout.js数组元素
- 在jquery中使用each,并为对应于段落的按钮单击事件
- 使用 javascript/jQuery 将触摸事件应用于每次点击事件
- 如何在角度可编辑中应用于更改事件
- jQuery事件在Mozilla上不起作用,并且适用于其他浏览器
- 将 jQuery 事件应用于两个 DOM ID 的选择器