首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将被动addEventListener替换为onTouchStart方法

将被动addEventListener替换为onTouchStart方法
EN

Stack Overflow用户
提问于 2019-04-29 12:19:16
回答 1查看 9.2K关注 0票数 1

我想把document.addEventListener('touchstart', handler, {passive: true});换成onTouchStart={handler}

因此,如果我在真上有被动标记,那么我的had方法应该如下所示:

代码语言:javascript
复制
const handler = (event) => { 
    console.log(event); 
} 

当我在假上有一个标志

代码语言:javascript
复制
 const handler = (event) => { 
    event.preventDefault();
    console.log(event); 
} 

我说的是被动事件侦听器和浏览器行为。仅仅是关于使用preventDefault()还是不使用?我理解得对不对?

EN

回答 1

Stack Overflow用户

发布于 2019-04-29 12:23:48

查看docs 这里

目前,浏览器无法知道触摸事件侦听器是否会取消滚动,所以总是在滚动页面之前等待监听器完成。被动事件侦听器通过使您能够在addEventListener的options参数中设置标志来解决此问题,指示侦听器永远不会取消滚动。

这意味着您更改了事件的行为。如果只更改preventDefault,它仍然具有事件的正常行为(而不是被动行为)。所以这不会改变什么。

在文档中,他们说要“删除”preventDefault的原因是,当将被动设置为true时,需要事件的默认操作。

这将是正常的事件,没有被动。

代码语言:javascript
复制
onTouchStart={handler}

这将添加被动动作,但由于preventDefault而删除

代码语言:javascript
复制
const handler = (event) => { 
    event.preventDefault();
    console.log(event); 
} 
...
onTouchStart={handler}

因此,您需要带有.addEventListener{passive: true},也需要删除.preventDefault()的任何调用。

以下是如何在任何组件中执行此操作的示例。

代码语言:javascript
复制
class SomeClass extends React.Component {

  componentDidMount() {
    this.elementYouWant.addEventListener("touchstart", this.handleTouchStart, {passive: true});
  }

  componentWillUnmount() {
    this.elementYouWant.removeEventListener("touchstart", this.handleTouchStart);
  }

  handleTouchStart = (e) => {
    console.log(e);
  }

  render() {
    return (
      <div ref={e => this.elementYouWant = e}>
        ...
      </div>
    );
  }

}

我搜索了如何将选项paramenter传递给事件侦听器,而不需要在react中componentDidMountcomponentWillUnmount中创建它,但是找不到它。

您可以看到这里是实现它的最佳方式,因为一些浏览器将{passive: true}解释为true,这将创建一个不同的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55903247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档