关于动态生成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获取事件对象代码
Aug 05 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
为原生js Array增加each方法
Apr 07 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
js实现新年倒计时效果
Dec 10 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
Apr 18 jQuery
JavaScript对JSON数组简单排序操作示例
Jan 31 Javascript
微信小程序自定义toast组件的方法详解【含动画】
May 11 Javascript
通过vue手动封装on、emit、off的代码详解
May 29 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
Sep 26 Javascript
JavaScript获取页面元素的常用方法详解
Sep 28 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php中fsockopen用法实例
2015/01/05 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
python单线程实现多个定时器示例
2014/03/30 Python
python实现封装得到virustotal扫描结果
2014/10/05 Python
python实现数据写入excel表格
2018/03/25 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
L’Artisan Parfumeur官网:法国香水品牌
2020/08/11 全球购物
应届生骨科医生求职信
2013/10/31 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js