Javascript 垂直滚动时禁用FlexSlider交互
我在用电话。当用户开始在触摸设备上垂直滚动页面时,我想禁用与滑块的任何交互,特别是当用户开始在滑块上触摸并垂直滑动时。我该怎么做 到目前为止,我所尝试的:Javascript 垂直滚动时禁用FlexSlider交互,javascript,jquery,css,touch,flexslider,Javascript,Jquery,Css,Touch,Flexslider,我在用电话。当用户开始在触摸设备上垂直滚动页面时,我想禁用与滑块的任何交互,特别是当用户开始在滑块上触摸并垂直滑动时。我该怎么做 到目前为止,我所尝试的: 当用户在滑块上水平滑动时,禁用页面的垂直滚动:jQuery(document).on('touchmove',function(event_u){event_u.preventDefault();})=>有效 使用if(\u scrollTop!==jQuery(window.scrollTop())方法=>检测垂直滚动 在滑块上方放置一层,
jQuery(document).on('touchmove',function(event_u){event_u.preventDefault();})
=>有效if(\u scrollTop!==jQuery(window.scrollTop())
方法=>检测垂直滚动jQuery(“#flexslider touch blocker”).show().focus()
=>不起作用display:block
时起作用,因此触摸事件直接触发并被阻挡层捕获。但是,如果用户已经在滚动页面,并且我在用户指尖正下方打开了阻止层,那么触摸事件显然不会到达该层。为什么?注:为了回答问题的这一部分,我给了额外的互联网积分
垂直滚动时,是否有其他方法禁用FlexSlider交互?可能在插件上使用纯css,可能使用overflow:hidden代码>还是别的什么
请不要建议使用其他插件或自己创建一个,因为我正在广泛使用FlexSlider功能
更新:
作为临时解决方案,我编辑了插件的源代码:
function onTouchMove(e) {
// START OF LIB EXTRANEOUS CODE
if (jQuery(this).hasClass('disabled')) { return; }
// END OF LIB EXTRANEOUS CODE
无论如何,如果你能想出一个更好的主意,那就太好了。我也遇到了同样的问题,并从FlexSlider GitHub中找到了一个潜在的解决方案:
根据这一建议,我在用户不滚动时删除了touchmove
侦听器,从而使其正常工作:
el.removeEventListener('touchmove', onTouchMove, false);
因此,onTouchMove()
类现在看起来如下所示:
function onTouchMove(e) {
dx = (vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX;
scrolling = (vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY));
if (!scrolling || Number(new Date()) - startT > 500) {
e.preventDefault();
if (!fade && slider.transitions) {
if (!vars.animationLoop) {
dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
}
slider.setProps(offset + dx, "setTouch");
}
} else {
el.removeEventListener('touchmove', onTouchMove, false);
}
}
函数onTouchMove(e){
dx=(垂直)?startX-e.touchs[0]。pageY:startX-e.touchs[0]。pageX;
滚动=(垂直)?(Math.abs(dx)500){
e、 预防默认值();
如果(!淡入淡出和滑动条.transitions){
如果(!vars.animationLoop){
dx=dx/((slider.currentSlide==0&&dx<0 | | slider.currentSlide==slider.last&&dx>0)?(Math.abs(dx)/cwidth+2):1);
}
slider.setProps(偏移量+dx,“setTouch”);
}
}否则{
el.removeEventListener('touchmove',onTouchMove,false);
}
}
谢谢贾斯汀。我仍然在寻找一个不改变插件代码的解决方案。在这个问题发布大约2个月后,Flexslider将这个修复提交到他们的主代码中。