V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jmyz0455
V2EX  ›  JavaScript

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

  •  1
     
  •   jmyz0455 · 2016-12-15 11:17:46 +08:00 · 1675 次点击
    这是一个创建于 2694 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    2 条回复    2016-12-15 12:08:31 +08:00
    qgy18
        1
    qgy18  
       2016-12-15 11:29:39 +08:00 via iPhone
    document.addEventListener("touchmove", dontmove(event), false);

    =>

    document.addEventListener("touchmove", dontmove, false);
    jmyz0455
        2
    jmyz0455  
    OP
       2016-12-15 12:08:31 +08:00
    @qgy18 谢谢指正,但是仍然无法解绑或恢复默认事件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   788 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:13 · PVG 05:13 · LAX 14:13 · JFK 17:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.