关于动态生成dom绑定事件失效的原因及解决方法


Posted in Javascript onAugust 06, 2016

之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试了一下:

1. 事件失效的原因:

(1)bind事件绑定只对dom中存在的元素有效,对于我们后来动态增加的元素是监测不到,所以绑定不了

(2)同样,当你使用var aa = document.getElementsByTagName("动态生成的元素");来获取动态生成的元素的时候也是获取不到的,因为网页只会执行一次初始化绑定,之后动态生成的dom元素也是监测不到的。

2. 解决办法:

(1)在每一个动态生成的地方都再绑定多一次事件,比如这个博客里面的例子

(2)把bind改用live,因为live是实时监测的,对于新增的dom元素也是有效的(因为不断去绑定、判断,所以可能会影响Web性能问题)

(3)把bind改用delegate,因为delegate是实时监测的。

(4)在jquery1.7 起版本用on替代了bind()、live() 和 delegate() 方法。

3. 关于最近遇到的事件失效的原因:在原本的网页中(代码可见https://github.com/UFOwl/ife/tree/master/stage02/task16),我想要获取table里面动态生成的删除按钮,帮删除按钮绑定删除时间,可是删除事件失效,因为删除按钮是动态生成的,初始化事件绑定的时候,获取到的table里面的button已经是空的,所以绑定的一直都是空元素,所以点击button按钮的时候一直没有反应。

4. 最后的解决办法:先获取table,然后再绑定table的click事件(因为table是在原本已经存在的dom元素),然后当点击事件触发的时候再捕获事件的target(比如点击table里面的button,这个时候因为已经动态生成button并append进去table里面了,所以button是存在的,此时target指的是button),然后再进行相应的操作。

注意:在这里注意两个问题:

(1)table里面的元素是已经添加进入table里面了的,所以点击那个button的时候,e.target获取到的就是button

(2)为什么已经将button这些元素添加进入table里面,可是还是没能获取到呢,因为是init()这个函数初始化的时候获取table里面的button,可是此时还未进行任何操作,所以获取到的就是空,所以没绑定任何元素。

上面需要注意的两个问题要分清楚,这个是问题的关键。

5.关于bind:每次绑定事件之后事件会一直绑定着,除非用unbind解绑之后再重新绑定,要不然事件会一直存在,所以这就是为什么在做项目的时候,有时候ajax请求的结果会出现1,2,4,8这样叠加,是因为如果用了bind,每次触发事件都会绑定一次操作,所以触发第一次的时候,ajax请求一次;第二次的时候,ajax请求1+1=2次;第三次就是1+2+1=4次;第四次就是1+2+4+1=8次,以此类推。所以如果利用bind绑定事件的话,要先unbind解绑元素原本有的事件再绑定事件,才不会导致ajax请求多次。

以上这篇关于动态生成dom绑定事件失效的原因及解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Timer实现代码
Feb 17 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
js实现在页面上弹出蒙板技巧简单实用
Apr 16 Javascript
js jq 单击和双击区分示例介绍
Nov 05 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
JS基于递归实现倒计时效果的方法
Nov 26 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
bing Map 在vue项目中的使用详解
Apr 09 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
微信小程序修改checkbox的样式代码实例
Jan 21 Javascript
深入理解JS DOM事件机制
Aug 06 #Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
Aug 06 #Javascript
用JS写的一个Ajax库(实例代码)
Aug 06 #Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 #Javascript
JS获取和修改元素样式的实例代码
Aug 06 #Javascript
原生js获取元素样式的简单方法
Aug 06 #Javascript
浅析Node.js实现HTTP文件下载
Aug 05 #Javascript
You might like
基于PHP对XML的操作详解
2013/06/07 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
Javascript 入门基础学习
2010/03/10 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
python图像常规操作
2017/11/11 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
python实现机器学习之多元线性回归
2018/09/06 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
使用pandas读取文件的实现
2019/07/31 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
EJB的基本架构
2016/09/22 面试题
中文系师范生自荐信
2013/10/01 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书