为何同样的操作下, addEventListener 传入的 Event 对象不一样?

2016-12-15 11:17:46 +08:00
 jmyz0455

场景:某个微信移动端网页,有个可以拖动的列表,在 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 对象不一样?

1761 次点击
所在节点    JavaScript
2 条回复
qgy18
2016-12-15 11:29:39 +08:00
document.addEventListener("touchmove", dontmove(event), false);

=>

document.addEventListener("touchmove", dontmove, false);
jmyz0455
2016-12-15 12:08:31 +08:00
@qgy18 谢谢指正,但是仍然无法解绑或恢复默认事件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327778

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX