元素增删事件DOMNodeInserted和DOMNodeRemoved
监听元素变化的三种方法:
- 对于表单类型的控件,使用onchange事件最好。
- 使用DOMNodeInserted和DOMNodeRemoved事件
- 使用定时器定时检测(下策)
有时需要给一个class类型的对象绑定某个事件,对于以后新插入的class类型的元素也要绑定这样的事件。jQuery中很好的实现了这一功能。实际上,只需要DOMNodeInserted和DOMNodeRemoved两个事件就可以监听元素增删,从而可以在增删元素之前,为元素绑定事件。
DOMNodeInserted和DOMNodeRemoved两个事件所对应的方法是浏览器自动执行的,执行时机为真正增删元素之前。
其它的DOM mutation事件:
- DOMAttrModified
- DOMAttributeNameChanged
- DOMCharacterDataModified
- DOMElementNameChanged
- DOMNodeInserted
- DOMNodeInsertedIntoDocument
- DOMNodeRemoved
- DOMNodeRemovedFromDocument
- DOMSubtreeModified
详情参考MDN
通过以下demo,操作并查看日志可以更好的理解这两个事件。
demo解释:有三个按钮,第一个按钮通过更改innerHTML来添加元素,第二个按钮通过创建元素并插入的方式来添加元素,第三个按钮用于删掉最后一个元素触发DOMNodeRemoved事件。
如果通过innerHTML添加元素,会首先触发很多次删除元素的操作,这样会有较大的创建、销毁对象开销,因此对于少量更改,尽量少用innerHTML而是用创建元素的方式。对于大量更改,使用innerHTML更合理。
<html>
<body>
<div id="main">
<button onclick="addOne()">add one by html</button>
<button onclick="add()">add one by element</button>
<button onclick="removeOne()">remove one by element</button>
</main>
</body>
<script>
var main = document.querySelector("#main")
function addOne() {
console.log("add node by html")
main.innerHTML += "<p>haha</p>";
console.log("added node")
}
function add() {
console.log("adding node by element")
var ele = document.createElement('p')
ele.innerHTML = "haha"
main.appendChild(ele)
console.log("added node")
}
function removeOne() {
var sons = main.children
var removing = sons[sons.length - 1]
console.log("removing " + removing.tagName)
if (removing.tagName.toLowerCase() == 'button') {
alert("别再remove了!")
return
}
main.removeChild(removing)
console.log("child removed")
}
document.body.addEventListener("DOMNodeInserted", function () {
console.log('DOMNode inserted')
console.log(arguments)
})
document.body.addEventListener("DOMNodeRemoved", function () {
console.log("DOMNode removed")
console.log(arguments)
})
</script>
</html>
元素增删事件DOMNodeInserted和DOMNodeRemoved的更多相关文章
- JavaScript事件 DOMNodeInserted DOMNodeRemoved
JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定交互的瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码. 13.1 事件流 ...
- jQuery中对未来的元素绑定事件
对未来的元素绑定事件不能用bind, 1.可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了. 2.推荐用on代 ...
- jQuery中对未来的元素绑定事件用bind、live or on
对未来的元素绑定事件不能用bind, 1.可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了. 2.推荐用on代 ...
- 给DOM生成的元素添加事件
问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件. 常见例子:在处理表格的时候,每行行末有个删除按钮,如下图.点击删除按钮的时候删除这一行. //html部分 ...
- Jquery动态添加的元素绑定事件的3种方法
假设我们点击li标签,弹出他的文本,如果是动态添加的li,点击是没有效果的,压根弹不出来文本. 下面博主分享一下为动态添加的元素绑定事件的三种方法,网上一般都是两种,我在这里多增加了一种. 事件案例: ...
- 给Jquery动态添加的元素添加事件
给Jquery动态添加的元素添加事件 来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866] 我想很多人都会向我一样曾经 被新元素的事件绑 ...
- jQuery对 动态添加 的元素 绑定事件(on()的用法)
从jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的(官方推荐)首选方法. 当浏览器下载完一个页面的时候就开始渲染(翻译)HTML标签,然后执行css.js代码,在执行js代 ...
- 通过原生JS实现为元素添加事件
自己写了一个为元素添加事件的方法,并封装到对象中. 说明: id : 目标元素的ID type: 事件的类型,注意的是不能加on fn:事件处理程序 isBubble :规定事件流 代码: var b ...
- jquery为新增元素添加事件
<script type="text/javascript"> var $id=1; $(function(){ $(".hehe").click( ...
随机推荐
- react聊天室|react+redux仿微信聊天IM实例|react仿微信界面
一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...
- 在 VS Code 中遇到的一些问题
1.在安装时未配置右键快捷菜单,想重新添加 最简单的就是重新安装一遍,在安装过程中选择好. 其次可以通过以下注册表脚本导入(保存为 .reg 文件),注意因为有中文字符,需要使用记事本保存为 ANSI ...
- MySQL 部署分布式架构 MyCAT (一)
架构 环境 主机名 IP db1 192.168.31.205 db2 192.168.31.206 前期准备 开启防火墙,安装配置 mysql (db1,db2) firewall-cmd --pe ...
- flask接收跨域请求
ajax发送数据类型为json即可 接受数据详见下文 https://www.cnblogs.com/anxminise/p/9814326.html
- ubuntu 查看软件包中的内容 (已经安装)
在 使用 apt 进行安装软件的时候,我们要经常判断,软件安装了什么和安装到什么地方.这时候 我们要使用 dpkg -L 命令来进行查看: 同样 在 fedora 上可以使用 rpm -ql iper ...
- 网络流(3)——找到最小st-剪切
在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网.与此同时,交战双方也想要以最小的代价切断敌军的补给,从而使敌军处于孤立无援的境地.在古今中外的各 ...
- 泛型T
作用: 使用泛型类型可以最大限度地重用代码.保护类型的安全以及提高性能. 泛型最常见的用途是创建集合类 1.性能:如List<object> 与 List<T> 将一个 int ...
- C#所有经典排序算法汇总
1.选择排序 选择排序 class SelectionSorter { private int min; public void Sort(int[] arr) ...
- 一,java框架学习
一,java框架学习 Hibernate概述Hibernate是一个开放源代码的ORM(对象关系映射)框架,对jdbc进行了轻量级的封装,是的java开发人员可以使用面向对象编程思想操作数据库,简化操 ...
- 古来月小队 Alpha冲刺阶段博客目录
一.Scrum Meeting 第六周: 链接:https://www.cnblogs.com/ouc-xxxxxx/p/11789325.html 任务:搭建安卓编程环境,学习安卓前端知识 第七周: ...