JS动态添加元素及绑定事件造成程序重复执行解决

  

  

本文主要给大家分享一下前段时间遇到的错误,这个bug是关于jquery的上方法绑交互事件,类似于<代码> $(“#点”)。(“点击”、“。阅读更多的函数(){})这样的代码造成的程序重复执行,很多人在文章里写到了,也说了用了方法来解绑,但都未能点出问题的本质,几乎都忽略了问题的本质其实是事件委托造成的。

  

  

<强>第一种:,,
  

        美元(文档)。(“点击”,函数(e) {   consol.log (“jquery事件绑定”)   });      

<强>第二种:,,
  

        文档。addEventListener(“点击”,函数(e) {   consol.log(“原生事件绑定的)   });      

<强>第三种:,,
  

        var id=setInterval(函数(){   console.log(“定时器循环事件绑定的)   },1000)、      

上面的代码,相信不少同盟,天天都会写到,看似简单的事件绑定,却经常能给我们带来意想不到的结果,特别是在这个温泉,应用AJAX页面局部刷新如此盛行的时代。

  

那什么是事件绑定,造成的程序重复执行呢?这个事情要说清除,好像不是那么简单,还是用一段测试代码来说明吧。你可以拷贝到本地,自己试试:,
  

        & lt; !DOCTYPE html>   & lt; html>   & lt; head>   & lt;元charset=皍tf - 8”比;   & lt; title> Title   & lt;/head>   & lt; body>   & lt;按钮类=" add_but "祝辞点击& lt;/button>   & lt; div id="点"祝辞fdfsdf   & lt;/div>   & lt;脚本src=" https://cdn.bootcss.com/jquery/1.8.3/jquery.js "祝辞& lt;/script>   & lt; script>   var计算=1;   var={例子   getData:函数(){   var=https://www.yisu.com/zixun/{数据   内容:“df”+数+ +,   href:“   };   this.renderData(数据);   },   renderData:功能(数据){   . getelementbyid(点).innerHTML=' & lt; div>这是一个“+ data.content +“点此& lt; class="阅读更多" href=" https://www.yisu.com/zixun/javasript;“rel=巴獠縩ofollow”rel=巴獠縩ofollow”在查看更多& lt;/a> & lt;/div>”;   $(" #点”)。(“点击”、“。阅读更多的函数(){   alert('事故发生点”);   })/* setInterval(函数(){   console.log (“fdfdfg”);   },2000);*//*用冒泡来绑定事件,类似于Jquery的绑上定事件*//* document.querySelector(身体的)。addEventListener(“点击”,函数(e) {   如果(e.target.classList.contains(“阅读更多”)){   alert('事故发生点”);   }   }) */}   };   document.querySelector (“.add_but”)。addEventListener(“点击”,函数(e) {   example.getData ();   e.stopImmediatePropagation ();   });   & lt;/script>   & lt;/body>   & lt;/html>      

以上是我为说清这个事情写的一段测试代码,可以拷贝下来试试。当我们点击页面的按钮,触发调用<代码> example.getData() 这个函数、模拟ajax获取数据成功后,就会根据局部刷新页面内元素类名为点的内容,同时会为加载这个内容中的阅读更多的标签绑定一个事件,就这样我们想要的效果出现啦,当元素第一次加载时,页面正常,“事故发生点“弹出一次,当二次刷新触发后,你会发现其弹出了两次,当第三次时,你会发现,其弹三次,以此类推....

  

OMG,这个程序到底怎么了,我明明每次事件绑定前,前面绑定的元素都删除了,为什么,被删除的尸体感觉还在动作,好吧,上面就是我第一次遇到这个情况发出的感叹。

  

最后是问身边的大神,才突然领悟,原来绑定一直都在,而这个绑定被保存在一个叫做事件队列的地方,他不在循环执行的主线程中,画了一张需要默契才能看懂的图,勉强看一看。

  

 JS动态添加元素及绑定事件造成程序重复执行解决

  

事件队列
  

  

  

其实上面那一段代码是为了测试而特意写的代码,除了定时器外,其他两个点击事件换个正常的写法,重复执行的情况是不会出现的,正常的代码:,,
  

     //jquery事件直接绑定的写法;   $(" #点.read-more”)。(“点击”,函数(){   alert('事故发生点”);   })//原生JS事件直接绑定的写法;   document.querySelector (“.read-more”)。addEventListener(“点击”,函数(e) {   alert('事故发生点”);   })

JS动态添加元素及绑定事件造成程序重复执行解决