自定义事件遇到的坑

1. JS触发原生事件

var ev = new Event("touchstart", {"bubbles":true, "cancelable":true});
document.addEventListener('touchstart',function(e){
  console.log(e);
 })
document.dispatchEvent(ev);

通过这种方法可以用JS触发原生事件

2. 创建的Event对象最好不要重用

昨天在写一个功能的时候用到了事件代理。简单点说就是一个大的DIV套了三个小的DIV,触发小DIV的touchstart事件由大的DIV来捕获处理。
一开始我是这么写的

var divs = document.querySelectorAll('.smallDiv'),
event = new Event('touchstart', {bubbles: true,cancelable: true});
for (i = 0; i < divs.length; i++) {
      divs[i].dispatchEvent(event);
}

我是想event创建一次就可以了,不用重复创建。但是遇到个问题,大DIV上只捕获到了一次,后面两次都没捕获到。找了半天才发现是大DIV上捕获的方法里有一句event.stopPropagation();因为处理的是同一个event。所以我估计这句话改变了event里某个属性。但是我查看了event里所有对象后发现并没有改变,打印stopPropagation方法出来的是native code,看来不是js能搞定的了,暂且估计是浏览器自己的实现吧。
知道了问题所在,我把代码改成一下就OK了

var divs = document.querySelectorAll('.smallDiv'),
event ;
for (i = 0; i < divs.length; i++) {
       event = new Event('touchstart', {bubbles: true,cancelable: true});
      divs[i].dispatchEvent(event);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 事件流: 事件流:页面接收事件的顺序。 IE定义的:事件冒泡流(由最具体的元素依次传播到DOM树的最上层的Docu...
    xiaoguo16阅读 3,723评论 0 0
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 8,173评论 1 10
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 4,952评论 0 0
  • 事件处理程序在应用中是必不可少的,虽然现在很多框架都有自己实现事件处理方法,但是熟知原生才能让我们应对各种各样的需...
    俗三疯阅读 2,498评论 0 1
  • Spring mvc 使用Gson 返回Json数据 中文乱码问题 最近在学习java web 使用Intllij...
    wvqusrtg阅读 9,771评论 0 0