关于动态生成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 常用函数
Dec 30 Javascript
js 复制或插入Html的实现方法小结
May 19 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
May 31 Javascript
JS 修改URL参数(实现代码)
Jul 08 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
jQuery中is()方法用法实例
Jan 06 Javascript
Javascript基础教程之数据类型 (数值 Number)
Jan 18 Javascript
Node.js重新刷新session过期时间的方法
Feb 04 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
深入理解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
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中的下划线详解
2015/06/24 Python
目前最全的python的就业方向
2018/06/05 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
使用Python更换外网IP的方法
2018/07/09 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
internal修饰符起什么作用
2013/12/16 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
认错检讨书
2014/10/02 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL