关于动态生成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 相关文章推荐
高效的表格行背景隔行变色及选定高亮的JS代码
Dec 04 Javascript
Jquery 数组操作大全个人总结
Nov 13 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
js获取下拉列表的值和元素个数示例
May 07 Javascript
jQuery实现的Div窗口震动特效
Jun 09 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
JavaScript核心语法总结(推荐)
Jun 02 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
Nov 28 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 Javascript
webpack 如何解析代码模块路径的实现
Sep 04 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
Python pandas用法最全整理
2019/08/04 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
50道外企软件测试面试题
2014/08/18 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
班组长岗位职责
2014/03/03 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
建筑工程催款函
2015/06/24 职场文书
2015年除四害工作总结
2015/07/23 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
python3操作redis实现List列表实例
2021/08/04 Python