场景:某个微信移动端网页,有个可以拖动的列表,在 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 对象不一样?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.