pdfjs整合至动态项目(如何操作JS给动态元素增加事件)

2026-04-27 11:15:01 :0

pdfjs整合至动态项目(如何操作JS给动态元素增加事件)

今天给各位分享如何操作JS给动态元素增加事件的知识,其中也会对如何操作JS给动态元素增加事件进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

如何操作JS给动态元素增加事件


这次给大家带来如何操作JS给动态元素增加事件,如操作JS给动态元素增加事件的注意事项有哪些,下面就是实战案例,一起来看一下。
我们在日常开发中有时会通过js创建一些元素,但是如果使用原始的for循环给创建的节点添加事件的方法往往行不通:
《!DOCTYPE html》
《html lang="en"》
《head》
《meta charset="UTF-8"》
《title》js动态添加事件《/title》
《/head》
《body》
《ul id="out-ul"》
《li class="out-li"》123《/li》
《li class="out-li"》123《/li》
《li class="out-li"》123《/li》
《/ul》
《button id="btn"》添加《/button》
《script》
document.getElementById(’btn’).addEventListener(’click’,function(){
var htmlFragment=’《li》我是新增的li《/li》’;
var addLi=document.createElement(’li’);
addLi.innerHTML=htmlFragment;
outUl.appendChild(addLi);
},false);
var outUl=document.getElementById(’out-ul’)
var outLi=outUl.getElementsByClassName(’out-li’);
for(var i=0;i《outLi.length;i++){
outLi.onclick=function(){
alert(1);
}
}
《/script》
《/body》
《/html》运行效果:
比如这样,通过for循环给li添加的事件无法绑定到新增的li上边,详细的原因这里不做解释。那么这个如何解决呢,其实办法也简单,就是通过事件委托的方式去解决,直接上代码,上面的代码简单改造:
《!DOCTYPE html》
《html lang="en"》
《head》
《meta charset="UTF-8"》
《title》www.gxlcms.com js动态添加事件《/title》
《/head》
《body》
《ul id="out-ul"》
《li class="out-li"》123《/li》
《li class="out-li"》123《/li》
《li class="out-li"》123《/li》
《/ul》
《button id="btn"》添加《/button》
《script》
var outUl=document.getElementById(’out-ul’)
var outLi=outUl.getElementsByClassName(’out-li’);
document.getElementById(’btn’).addEventListener(’click’,function(){
var htmlFragment=’《li》我是新增的li《/li》’;
var addLi=document.createElement(’li’);
addLi.innerHTML=htmlFragment;
outUl.appendChild(addLi);
},false);
outUl.addEventListener(’click’,function(e){
e=e || window.event;//兼容ie
alert(e.target.innerHTML);
}, false);
《/script》
《/body》
《/html》相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
实战项目中如何使用jquery filter()
nodejs+server.js创建 Web 服务器

在JS中如何实现动态添加元素


这篇文章主要给大家介绍了关于JS动态添加元素及绑定事件造成程序重复执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
前言
本文主要给大家分享一下前段时间遇到的bug,这个Bug是关于jquery 的on方法绑交互事件,类似于$(’#point’).on(’click’,’.read-more’,function () {})这样的代码造成的程序重复执行,很多人在文章里写到了,也说了用off方法来解绑,但都未能点出问题的本质,几乎都忽略了问题的本质其实是事件委托造成的。
话不多说,上点天天看到的代码:
第一种:
$(document).on(’click’, function (e) {
consol.log(’jquery事件绑定’)
});第二种:
document.addEventListener(’click’,function (e) {
consol.log(’原生事件绑定’)
});第三种:
var id = setInterval(function () {
console.log(’定时器循环事件绑定’)
},1000);上面的代码,相信不少同盟,天天都会写到,看似简单的事件绑定,却经常能给我们带来意想不到的结果,特别是在这个SPA,应用AJAX页面局部刷新如此盛行的时代。
那什么是事件绑定,造成的程序重复执行呢?这个事情要说清除,好像不是那么简单,还是用一段测试代码来说明吧。你可以拷贝到本地,自己试试:
《!DOCTYPE html》
《html》
《head》
《meta charset="UTF-8"》
《title》Title《/title》
《/head》
《body》
《button class="add_but"》点击《/button》
《p id="point"》fdfsdf
《/p》
***隐藏网址***
《script》
var count=1;
var example = {
getData:function () {
var data ={
content:’df’+count++,
href:’’
};
this.renderData(data);
},
renderData:function (data) {
document.getElementById(’point’).innerHTML=’《p》this is a ’+data.content+’点此《a class="read-more" href="javasript:;" rel="external nofollow" rel="external nofollow" 》查看更多《/a》《/p》’;
$(’#point’).on(’click’,’.read-more’,function () {
alert(’事故发生点’);
})
/* setInterval(function () {
console.log(’fdfdfg’);
},2000);*/
/*用冒泡来绑定事件,类似于Jquery的on绑定事件*/
/* document.querySelector(’body’).addEventListener(’click’,function (e) {
if(e.target.classList.contains(’read-more’)){
alert(’事故发生点’);
}
})*/
}
} ;
document.querySelector(’.add_but’).addEventListener(’click’,function (e) {
example.getData();
e.stopImmediatePropagation();
});
《/script》
《/body》
《/html》以上是我为说清这个事情写的一段测试代码,可以拷贝下来试试。当我们点击页面的按钮,触发调用example.getData()这个函数,模拟ajax获取数据成功后,就会根据局部刷新页面内元素类名为point的内容,同时会为加载这个内容中的read-more A标签绑定一个事件,就这样我们想要的效果出现啦,当元素第一次加载时,页面正常,‘事故发生点’弹出一次,当二次刷新触发后,你会发现其弹出了两次,当第三次时,你会发现,其弹三次,以此类推。。
OMG,这个程序到底怎么了,我明明每次事件绑定前,前面绑定的元素都删除了,为什么,被删除的尸体感觉还在动作,好吧,上面就是我第一次遇到这个情况发出的感叹。
最后是问身边的大神,才突然领悟,原来绑定一直都在,而这个绑定被保存在一个叫做事件队列的地方,他不在循环执行的主线程中,画了一张需要默契才能看懂的图,勉强看一看。
事件队列
还原真相
其实上面那一段代码是为了测试而特意写的代码,除了定时器外,其他两个点击事件换个正常的写法,重复执行的情况是不会出现的,正常的代码:
// jquery 事件直接绑定的写法;
$(’#point .read-more’).on(’click’,function () {
alert(’事故发生点’);
})
// 原生JS 事件直接绑定的写法;
document.querySelector(’.read-more’).addEventListener(’click’,function (e) {
alert(’事故发生点’);
})看出差别了吗?其实就是不用冒泡来事件委托,而是直接给添加的元素绑定事件。所以Dom事件是讲道理的,动态添加的元素,再动态为此绑定事件,待元素被删除后,与其绑定的相应事件其实是会从事件绑定队列中删除的,而非如上面测试代码,给人的感觉是元素移除后,但其绑定的事件还在内存中。但请记住,这是个误会,上面测试的代码之所以给人这种错觉,是因为我们并没有为动态添加的元素绑定事件,而仅仅是用了事件委托的形式,实际上事件是绑定在#point元素上的,其一直存在,利用事件冒泡来让程序知道我们点击了动态添加的链接元素。测试中特意用原生js去重现了这次事件委托,jquery的on绑定事件其实原理基本相同。
document.querySelector(’body’).addEventListener(’click’,function (e) {
if(e.target.classList.contains(’read-more’)){
alert(’事故发生点’);
}
})解除bug的那些方法
定时器
这个是最易犯的错误,当然也是最易解的错误,因为设定定时器时,其会返回一个数值,这个数值应该是事件队列此定时器中的一个编号吧,类似于9527;步骤就是设定一个全局变量来保持这个返回值id,在每次设定定时器时,先通过id清除已经设定过的定时器
clearInterval(intervalId); //粗暴的写法
intervalId&&clearInterval(intervalId); //严谨的写法
intervalId=setInterval(function () {
console.log(’fdfdfg’);
},2000);Dom事件
其实上面我们已经说过,最直接的办法就是不采用事件委托,而是采用直接绑定;如果确实要用事件委托来绑定事件,那就是解绑。在jquery中提供了unbind函数来解绑事件,不过在jquery 1.8版本以后,这个方法已经不推荐了,而是推荐off方法。比如上面的on事件委托的方式,要解绑,可采用语句$(’#point’).off(’click’,’.read-more’) 。
有缺陷的解决方案,添加flag
很好理解,第一次绑定后,flag置位,下一次在执行这个绑定时,程序就知道在这个节点上已经有了绑定,无需再添加,具体操作就是:
var flag = false;
var example = {
getData: function () {
var data = {
content: ’df’ + count++,
href: ’’
};
this.renderData(data);
},
renderData: function (data) {
document.getElementById(’point’).innerHTML = ’《p》this is a ’ + data.content + ’点此《a class="read-more" href="javasript:;" rel="external nofollow" rel="external nofollow" 》查看更多《/a》《/p》’;
!flag && $(’#point’).on(’click’, ’.read-more’, function () {
alert(’事故发生点’+data.content);
});
flag = true;
}
};从逻辑上,看起来没有问题,但仔细观察,发现这是有问题的。当我们第二次,第三次刷新时,弹出框的内容还是和第一次模拟刷新后点击后弹出的内容一致,还是’事故发生点df1’,而非和内容一样递增,为什么呢,感觉事件队列里面的回调函数被单独保存起来了,data被深拷贝了,而不再是一个引用。确实有点难理解,我也不知道到底是为什么,如果哪位能说清楚,还请一定告知。
结个尾写在最后,其实平常写一些程序时,事件绑定,造成程序重复执行这些情况很少发生,其通常会出现在我们写插件的时候,插件需要适应多种调用环境,所以在插件内部做到防止事件重复绑定的情况非常重要。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
使用node.js如何创建子进程(详细教程)
使用ES6如何实现单例模式
如何把Angular项目部署到nginx上
在vue中使用v-model如何实现父子组件通信
在react中有关组件通信有哪些方法?

文章分享结束,pdfjs整合至动态项目和如何操作JS给动态元素增加事件的答案你都知道了吗?欢迎再次光临本站哦!

pdfjs整合至动态项目(如何操作JS给动态元素增加事件)

本文编辑:admin

更多文章:


足迹控拍app官网(智慧生活app摄像头)

足迹控拍app官网(智慧生活app摄像头)

各位老铁们,大家好,今天由我来为大家分享足迹控拍app官网,以及智慧生活app摄像头的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录智慧生活app摄

2026年5月27日 12:45

小于大于符号是往哪边(大于小于怎么分方向)

小于大于符号是往哪边(大于小于怎么分方向)

其实小于大于符号是往哪边的问题并不复杂,但是又很多的朋友都不太了解大于小于怎么分方向,因此呢,今天小编就来为大家分享小于大于符号是往哪边的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录大于小于怎么分方向口朝右边的

2026年5月18日 04:00

kali上传文件到apache服务器(如何在macOS系统和KaliLinux系统之间共享文件)

kali上传文件到apache服务器(如何在macOS系统和KaliLinux系统之间共享文件)

各位老铁们好,相信很多人对kali上传文件到apache服务器都不是特别的了解,因此呢,今天就来为大家分享下关于kali上传文件到apache服务器以及如何在macOS系统和KaliLinux系统之间共享文件的问题知识,还望可以帮助大家,解

2025年10月25日 23:30

plsql客户端下载(plsql客户端怎么配置环境变量)

plsql客户端下载(plsql客户端怎么配置环境变量)

其实plsql客户端下载的问题并不复杂,但是又很多的朋友都不太了解plsql客户端怎么配置环境变量,因此呢,今天小编就来为大家分享plsql客户端下载的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录plsql客户

2025年8月9日 05:15

蓝色背景字体颜色搭配(红色,蓝色的背景配什么字体好看)

蓝色背景字体颜色搭配(红色,蓝色的背景配什么字体好看)

本篇文章给大家谈谈蓝色背景字体颜色搭配,以及红色,蓝色的背景配什么字体好看对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录红色,蓝色的背景配什么字体好看蓝底放什么颜色字体更清晰红色,蓝色的背景配什么字体好看红色和蓝色的背景可以

2026年8月13日 00:00

c语言一维数组有几个数(c语言的一维数组中至少要有几个元素)

c语言一维数组有几个数(c语言的一维数组中至少要有几个元素)

大家好,如果您还对c语言一维数组有几个数不太了解,没有关系,今天就由本站为大家分享c语言一维数组有几个数的知识,包括c语言的一维数组中至少要有几个元素的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录c语言的一维数组

2025年11月27日 13:30

织梦岛隐藏要素(塞尔达传说织梦岛脸孔神殿迷宫怎么通关 脸孔神殿迷宫)

织梦岛隐藏要素(塞尔达传说织梦岛脸孔神殿迷宫怎么通关 脸孔神殿迷宫)

本篇文章给大家谈谈织梦岛隐藏要素,以及塞尔达传说织梦岛脸孔神殿迷宫怎么通关 脸孔神殿迷宫对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录塞尔

2025年9月18日 18:45

最新版android studio安装(如何安装android studio)

最新版android studio安装(如何安装android studio)

“最新版android studio安装”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看最新版android studio安装(如何安装android studio)!本文目录如何安装android studio如何安装an

2025年9月24日 10:15

97的十六进制(97 98 换成八进制 如何换 如何将十进制转换成八进制或者十六进制 哪位大仙帮帮忙)

97的十六进制(97 98 换成八进制 如何换 如何将十进制转换成八进制或者十六进制 哪位大仙帮帮忙)

各位老铁们,大家好,今天由我来为大家分享97的十六进制,以及97 98 换成八进制 如何换 如何将十进制转换成八进制或者十六进制 哪位大仙帮帮忙的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的

2026年4月5日 15:00

redis命令登录(软件Xshell连接Redis操作教程)

redis命令登录(软件Xshell连接Redis操作教程)

大家好,redis命令登录相信很多的网友都不是很明白,包括软件Xshell连接Redis操作教程也是一样,不过没有关系,接下来就来为大家分享关于redis命令登录和软件Xshell连接Redis操作教程的一些知识点,大家可以关注收藏,免得下

2026年6月6日 17:30

category nouns(the different lexical category in translation)

category nouns(the different lexical category in translation)

本篇文章给大家谈谈category nouns,以及the different lexical category in translation对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助

2026年1月9日 10:45

pipeline密网支架是啥材质(密网支架影响寿命吗)

pipeline密网支架是啥材质(密网支架影响寿命吗)

大家好,关于pipeline密网支架是啥材质很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于密网支架影响寿命吗的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本

2025年7月4日 14:45

论坛源码可发布视频(怎么用代码在论坛发视频 文件  啊)

论坛源码可发布视频(怎么用代码在论坛发视频 文件 啊)

大家好,论坛源码可发布视频相信很多的网友都不是很明白,包括怎么用代码在论坛发视频 文件 啊也是一样,不过没有关系,接下来就来为大家分享关于论坛源码可发布视频和怎么用代码在论坛发视频 文件 啊的一些知识点,大家可以关注收藏,免得下次来找不

2025年6月13日 00:45

哈夫曼树编码不唯一那解码结果(如何解决哈夫曼树不唯一的问题)

哈夫曼树编码不唯一那解码结果(如何解决哈夫曼树不唯一的问题)

本篇文章给大家谈谈哈夫曼树编码不唯一那解码结果,以及如何解决哈夫曼树不唯一的问题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录如何解决哈夫曼树不唯一的问题霍夫曼编码如何解码如何解决哈夫曼树不唯一的问题肯定不唯一:一个stri

2025年6月24日 02:45

ascii码是内码吗(什么是ASCII编码)

ascii码是内码吗(什么是ASCII编码)

各位老铁们好,相信很多人对ascii码是内码吗都不是特别的了解,因此呢,今天就来为大家分享下关于ascii码是内码吗以及什么是ASCII编码的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录什么是ASCII编码在纯

2025年8月25日 03:45

关系数据库管理系统有哪些?(下面哪些属于关系型数据库管理系统())

关系数据库管理系统有哪些?(下面哪些属于关系型数据库管理系统())

各位老铁们好,相信很多人对关系数据库管理系统有哪些?都不是特别的了解,因此呢,今天就来为大家分享下关于关系数据库管理系统有哪些?以及下面哪些属于关系型数据库管理系统()的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文

2026年5月2日 12:15

escapehtml方法(HTML5三种对密码加密的方法)

escapehtml方法(HTML5三种对密码加密的方法)

“escapehtml方法”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看escapehtml方法(HTML5三种对密码加密的方法)!本文目录HTML5三种对密码加密的方法求教java中有没有方法实现html转义string

2025年12月2日 02:30

insertrow(在Power Query中如何插入自定义行)

insertrow(在Power Query中如何插入自定义行)

各位老铁们好,相信很多人对insertrow都不是特别的了解,因此呢,今天就来为大家分享下关于insertrow以及在Power Query中如何插入自定义行的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录在Po

2025年10月10日 12:30

redis缓存策略(Redis缓存雪崩就这么简单)

redis缓存策略(Redis缓存雪崩就这么简单)

大家好,如果您还对redis缓存策略不太了解,没有关系,今天就由本站为大家分享redis缓存策略的知识,包括Redis缓存雪崩就这么简单的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录Redis缓存雪崩就这么简单用

2025年7月27日 02:00

多线程工作英文(什么是线程)

多线程工作英文(什么是线程)

各位老铁们好,相信很多人对多线程工作英文都不是特别的了解,因此呢,今天就来为大家分享下关于多线程工作英文以及什么是线程的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录什么是线程线程英文计算机专业英语 中译英什么是

2026年5月1日 09:15

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索