jQuery中DOM节点的删除方法总结(超全面)


Posted in Javascript onJanuary 22, 2017

前言

相信大家都知道,要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题。下面本文就进行一个详细的介绍,感兴趣的朋友们一起来看看吧。

一、empty

empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只移除了 指定元素中的所有子节点。

这个方法不仅移除子元素(和其他后代元素),同样移除元素里的文本。因为,根据说明,元素里任何文本字符串都被看做是该元素的子节点。如果我们通过empty方法移除里面div的所有元素,它只是清空内部的html代码,但是标记仍然留在DOM中,通过empty移除了当前div元素下的所有p元素 但是本身id=test的div元素没有被删除。

$("button").on('click', function() {
 //通过empty移除了当前div元素下的所有p元素
 //但是本身id=test的div元素没有被删除
 $("#test").empty()
 })

二、remove

remove与empty一样,都是移除元素的方法,但是remove会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。

例如一段节点,绑定点击事件,如果不通过remove方法删除这个节点其实也很简单,但是同时需要把事件给销毁掉,这里是为了防止"内存泄漏",所以前端开发者一定要注意,绑了多少事件,不用的时候一定要记得销毁。通过remove方法移除div及其内部所有元素,remove内部会自动操作事件销毁方法,所以使用使用起来非常简单

remove表达式参数:

remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点,我们可以通过$()选择一组相同的元素,然后通过remove()传递筛选的规则,如:$("p").filter(":contains('3')").remove()

<body>
 <style>
 .test1 {
 background: #bbffaa;
 }
 
 .test2 {
 background: yellow;
 }
 </style>
 <h2>通过jQuery remove方法移除元素</h2>
 <div class="test1">
 <p>p元素1</p>
 <p>p元素2</p>
 </div>
 <div class="test2">
 <p>p元素3</p>
 <p>p元素4</p>
 </div>
 <button>点击通过jQuery的empty移除元素</button>
 <button>点击通过jQuery的empty移除指定元素</button>
 <script type="text/javascript">
 $("button:first").on('click', function() {
 //删除整个 class=test1的div节点
 $(".test1").remove()
 })

 $("button:last").on('click', function() {
 //找到所有p元素中,包含了3的元素
 //这个也是一个过滤器的处理
 $("p").remove(":contains('3')")
 })
 </script>
</body>

empty和remove区别

用到移除指定元素的时候,jQuery提供了empty()remove([expr])二个方法,两个都是删除元素,但是两者还是有区别

empty方法

  • 严格地讲,empty()方法并不是删除节点,而是清空节点,它能清空元素中的所有后代节点
  • empty不能删除自己本身这个节点

remove方法

  • 该节点与该节点所包含的所有后代节点将同时被删除
  • 提供传递一个筛选的表达式,用来指定删除选中合集中的元素

三、detach

如果我们希望临时删除页面上的节点,但是又不希望节点上的数据与事件丢失,并且能在下一个时间段让这个删除的节点显示到页面,这时候就可以使用detach方法来处理detach从字面上就很容易理解。让一个web元素托管。即从当前页面中移除该元素,但保留这个元素的内存模型对象。

官方解释:这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。 $("div").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。

当然这里要特别注意,detach方法是JQuery特有的,所以它只能处理通过JQuery的方法绑定的事件或者数据

通过 $("p").detach()把所有的P元素元素删除后,在通过append把删除的p放到页面上,可以通过点击文字测试,事件没有丢失

<body>
 <p>P元素1,默认给绑定一个点击事件</p>
 <p>P元素2,默认给绑定一个点击事件</p>
 <button id="bt1">点击删除 p 元素</button>
 <button id="bt2">点击移动 p 元素</button>
 <script type="text/javascript">
 $('p').click(function(e) {
 alert(e.target.innerHTML)
 })
 var p;
 $("#bt1").click(function() {
 if (!$("p").length) return; //去重
 //通过detach方法删除元素
 //只是页面不可见,但是这个节点还是保存在内存中
 //数据与事件都不会丢失
 p = $("p").detach()
 });

 $("#bt2").click(function() {
 //把p元素在添加到页面中
 //事件还是存在
 $("body").append(p);
 });
 </script>
</body>

detach()和remove()区别

JQuery是一个很大强的工具库,在工作中开发中,可是有些方法还是因为不常用到,或是没有注意到而被我们而忽略。remove()detach()可能就是其中的一个,可能remove()我们用得比较多,而detach()就可能会很少了

通过一张对比表来解释2个方法之间的不同 

方法名 参数 事件及数据是否也被移除 元素自身是否被移除
remove 支持选择器表达 是(无参数时),有参数时要根据参数所涉及的范围
detach 参数同remove 情况同remove

remove:移除节点

  • 无参数,移除自身整个节点以及该节点的内部的所有节点,包括节点上事件与数据
  • 有参数,移除筛选出的节点以及该节点的内部的所有节点,包括节点上事件与数据

detach:移除节点

  • 移除的处理与remove一致
  • remove()不同的是,所有绑定的事件、附加的数据等都会保留下来
  • 例如:$("p").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
javascript 写类方式之五
Jul 05 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
Jan 08 Javascript
动态加载js、css等文件跨iframe实现
Feb 24 Javascript
jquery实现标签上移、下移、置顶
Apr 26 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
Dec 14 Javascript
canvas知识总结
Jan 25 Javascript
原生JS+HTML5实现的可调节写字板功能示例
Aug 30 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
koa2实现登录注册功能的示例代码
Dec 03 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
js实现贪吃蛇小游戏(容易理解)
Jan 22 #Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
Jan 22 #Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
Jan 22 #Javascript
js实现图片360度旋转
Jan 22 #Javascript
Vue 过渡(动画)transition组件案例详解
Jan 22 #Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
Jan 22 #Javascript
boostrapTable的refresh和refreshOptions区别浅析
Jan 22 #Javascript
You might like
Terran剧情介绍
2020/03/14 星际争霸
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
Python扫描端口的实现
2021/01/25 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
优秀党员主要事迹
2014/01/19 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
公司出差管理制度范本
2015/08/05 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js