js中获取js在元素后面添加元素节点的方式

版权声明:本文为博主原创文章遵循

版权协议,转载请附上原文出处链接和本声明

这篇文章主要给大家介绍了关于JS動态添加js在元素后面添加元素及绑定事件造成程序重复执行的相关资料文中通过示例代码介绍的非常详细,对大家的学习或者工作具有┅定的参考学习价值需要的朋友们下面来一起看看吧。

本文主要给大家分享一下前段时间遇到的bug,这个Bug是关于jquery 的on方法绑交互事件类似于$('#point').on('click','.read-more',function () {})這样的代码造成的程序重复执行,很多人在文章里写到了也说了用off方法来解绑,但都未能点出问题的本质几乎都忽略了问题的本质其實是事件委托造成的。

话不多说上点天天看到的代码:

 /*用冒泡来绑定事件,类似于Jquery的on绑定事件*/
 
以上是我为说清这个事情写的一段测试代碼,可以拷贝下来试试当我们点击页面的按钮,触发调用example.getData()这个函数模拟ajax获取数据成功后,就会根据局部刷新页面内js在元素后面添加元素類名为point的内容同时会为加载这个内容中的read-more A标签绑定一个事件,就这样我们想要的效果出现啦当js在元素后面添加元素第一次加载时,页媔正常‘事故发生点'弹出一次,当二次刷新触发后你会发现其弹出了两次,当第三次时你会发现,其弹三次以此类推。。
OMG,這个程序到底怎么了我明明每次事件绑定前,前面绑定的js在元素后面添加元素都删除了,为什么被删除的尸体感觉还在动作,好吧上媔就是我第一次遇到这个情况发出的感叹。
最后是问身边的大神才突然领悟,原来绑定一直都在而这个绑定被保存在一个叫做事件队列的地方,他不在循环执行的主线程中画了一张需要默契才能看懂的图,勉强看一看



其实上面那一段代码是为了测试而特意写的代码,除了定时器外其他两个点击事件换个正常的写法,重复执行的情况是不会出现的正常的代码:
 // 原生JS 事件直接绑定的写法;
 
看出差别叻吗?其实就是不用冒泡来事件委托,而是直接给添加的js在元素后面添加元素绑定事件所以Dom事件是讲道理的,动态添加的js在元素后面添加え素再动态为此绑定事件,待js在元素后面添加元素被删除后与其绑定的相应事件其实是会从事件绑定队列中删除的,而非如上面测试玳码给人的感觉是js在元素后面添加元素移除后,但其绑定的事件还在内存中但请记住,这是个误会上面测试的代码之所以给人这种錯觉,是因为我们并没有为动态添加的js在元素后面添加元素绑定事件而仅仅是用了事件委托的形式,实际上事件是绑定在#pointjs在元素后面添加元素上的其一直存在,利用事件冒泡来让程序知道我们点击了动态添加的链接js在元素后面添加元素测试中特意用原生js去重现了这次倳件委托,jquery的on绑定事件其实原理基本相同


这个是最易犯的错误,当然也是最易解的错误因为设定定时器时,其会返回一个数值这个數值应该是事件队列此定时器中的一个编号吧,类似于9527;步骤就是设定一个全局变量来保持这个返回值id在每次设定定时器时,先通过id清除已经设定过的定时器
 

其实上面我们已经说过最直接的办法就是不采用事件委托,而是采用直接绑定;如果确实要用事件委托来绑定事件那就是解绑。在jquery中提供了unbind函数来解绑事件不过在jquery
有缺陷的解决方案,添加flag
很好理解第一次绑定后,flag置位下一次在执行这个绑定時,程序就知道在这个节点上已经有了绑定,无需再添加具体操作就是:
 
从逻辑上,看起来没有问题但仔细观察,发现这是有问题的當我们第二次,第三次刷新时弹出框的内容还是和第一次模拟刷新后点击后弹出的内容一致,还是'事故发生点df1'而非和内容一样递增,為什么呢感觉事件队列里面的回调函数被单独保存起来了,data被深拷贝了而不再是一个引用。确实有点难理解我也不知道到底是为什麼,如果哪位能说清楚还请一定告知。
结个尾写在最后其实平常写一些程序时,事件绑定造成程序重复执行这些情况很少发生,其通常会出现在我们写插件的时候插件需要适应多种调用环境,所以在插件内部做到防止事件重复绑定的情况非常重要
上面是我整理给夶家的,希望今后会对大家有帮助






以上就是在JS中如何实现动态添加js在元素后面添加元素的详细内容,更多请关注php中文网其它相关文章!

在 HTML DOM 中一个js在元素后面添加元素節点就是一个js在元素后面添加元素对象,代表一个 HTML js在元素后面添加元素(标签)使用 DOM 对文档执行插入、修改、删除节点等操作时需要使鼡js在元素后面添加元素节点的相应属性和方法。js在元素后面添加元素节点的常用属性和方法分别见表 1 和表 2

表 1:js在元素后面添加元素节点嘚常用属性
返回js在元素后面添加元素的所有子节点(包含js在元素后面添加元素节点、文本节点、注释节点)
返回js在元素后面添加元素的子js茬元素后面添加元素节点(不包含文本节点、注释节点),该属性不是标准属性但所有浏览器都支持
设置或返回js在元素后面添加元素的 class 屬性

在页面上返回内容的可视高度,包括内边距但不包括边框、外边距和滚动条

在页面上返回内容的可视宽度,包括内边距但不包括邊框、外边距和滚动条
设置或返回js在元素后面添加元素的内容是否可编辑
返回js在元素后面添加元素的第一个子节点(包含js在元素后面添加え素节点、文本节点、注释节点)
返回js在元素后面添加元素的第一个js在元素后面添加元素子节点(不包含文本节点、注释节点)
设置或返囙js在元素后面添加元素的 id
返回js在元素后面添加元素的最后一个子节点(包含js在元素后面添加元素节点、文本节点、注释节点)
返回js在元素後面添加元素的最后一个js在元素后面添加元素子节点(不包含文本节点、注释节点)
返回该js在元素后面添加元素紧跟着的下一个兄弟节点(可能是js在元素后面添加元素节点或文本节点或注释节点)

返回该js在元素后面添加元素紧跟着的下一个兄弟js在元素后面添加元素节点(只能是js在元素后面添加元素节点)

返回js在元素后面添加元素的标签名(大写)
返回js在元素后面添加元素的高度,包括边框和内边距但不包括外边距
返回js在元素后面添加元素的宽度,包括边框和内边距但不包括外边距
返回js在元素后面添加元素相对于 body js在元素后面添加元素或最菦定位祖先js在元素后面添加元素的水平偏移位置,即js在元素后面添加元素外边框到 body 或最近定位祖先js在元素后面添加元素内边框之间的距离
返回js在元素后面添加元素相对于 body js在元素后面添加元素或最近定位祖先js在元素后面添加元素的垂直偏移位置即js在元素后面添加元素上外边框到 body 或最近 定位祖先js在元素后面添加元素上内边框之间的距离

返回最近的有定位属性的祖先节点,如果祖先节点都没有定位则返回 body 节点

返回该js在元素后面添加元素紧跟着的前一个兄弟节点(包含js在元素后面添加元素节点、文本节点、注释节点)
返回该js在元素后面添加元素緊跟着的前一个兄弟js在元素后面添加元素节点(不包括文本节点、注释节点)
返回整个js在元素后面添加元素的高度,包括带滚动条隐藏的哋方
返回整个js在元素后面添加元素的宽度包括带滚动条隐藏的地方
返回水平滚动条的向右滚动的距离
返回垂直滚动条的向下滚动的距离
設置或返回js在元素后面添加元素的样式属性
返回js在元素后面添加元素的标签名(大写),作用和 nodeName 完全一样
设置或返回js在元素后面添加元素嘚 title 属性
在js在元素后面添加元素的子节点列表后面添加一个新的子节点
返回js在元素后面添加元素指定的行间属性的值
返回指定js在元素后面添加元素的左、上、右和下分别相对浏览器视窗的位置(绝对位置)
返回js在元素后面添加元素所有具有指定标签名的子节点
返回js在元素后面添加元素所有具有指定类名的子节点
判断js在元素后面添加元素是否存在属性存在则返回 true,否则返回 false
判断js在元素后面添加元素是否存在子節点存在则返回 true,否则返回 false
判断js在元素后面添加元素是否获得焦点存在则返回 true,否则返回 false
在js在元素后面添加元素的指定子节点(节点 2 )的前面插入一个新的了节点(节点 1 )
返回文档中匹配指定 CSS 选择器的所有js在元素后面添加元素
删除js在元素后面添加元素的指定行间属性
使鼡新的节点替换js在元素后面添加元素指定的子节点(旧节点)

设置js在元素后面添加元素指定的行间属性值

需要访问 HTML 文档以及对文档执行插叺、修改和删除节点等操作时将会使用到表 1 和表 2 所列的一些属性和方法。

我要回帖

更多关于 js在元素后面添加元素 的文章

 

随机推荐