场景:某个微信移动端网页,有个可以拖动的列表,在 iOS 里往上拉到列表底部的时候,整个网页会被“拉”上去,露出深灰色微信背景,大家在 iOS 试一试就知道了。
需求:上面的情况是允许的,但是当我点击列表项弹出窗口后,就不允许整个网页会被“拉”上去。所以我想在没有弹出窗口时,页面允许滑动,当弹出窗口后,就不允许滑动事件了。
问题:我的解决方法是,弹出窗口后,用 document.addEventListener 和 document.removeEventListener 来禁止、解除禁止滑动事件,我的代码如下
//禁止滑动
function dontmove(e) { e.preventDefault(); console.log(e); }
document.addEventListener("touchmove", dontmove(event), false);
//解除禁止
document.removeEventListener('touchmove', dontmove(event), false);
但是上面的方法不奏效,当我把禁止滑动换成:
document.addEventListener("touchmove", function(e) { e.preventDefault(); console.log(e); }, false);
就可以禁止滑动了,但是这个匿名函数没办法用解绑啊,而且手指上滑时,在 console 看到前者输出来的 Event 是:
MouseEvent {isTrusted: true, screenX: 209, screenY: 577, clientX: 320, clientY: 902 …}
而后者,匿名函数输出来的是:
TouchEvent {isTrusted: true, touches: TouchList, targetTouches: TouchList, changedTouches: TouchList, altKey: false …}
在手机端输出也是一样的,请问在同样的操作下,为什么 addEventListener 传入的 Event 对象不一样?
1
qgy18 2016-12-15 11:29:39 +08:00 via iPhone
document.addEventListener("touchmove", dontmove(event), false);
=> document.addEventListener("touchmove", dontmove, false); |