基于DOM节点删除之empty和remove的区别(详解)


Posted in Javascript onSeptember 11, 2017

要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty和remove方法

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

这个方法不仅移除子元素(和其他后代元素),同样移除元素里的文本。因为,根据说明,元素里任何文本字符串都被看做是该元素的子节点。请看下面的HTML:

<div class="hello"><p>这是p标签</p></div>

如果我们通过empty方法移除里面div的所有元素,它只是清空内部的html代码,但是标记仍然留在DOM中

//通过empty处理
$('.hello').empty()

//结果:<p>这是p标签</p>被移除
<div class="hello"></div>

通过empty移除了当前div元素下的所有p元素,但是本身id=test的div元素没有被删除

<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title></title>
  <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
  <style>
  div {
    background: #bbffaa;
    width: 300px;
  }
  </style>
</head>

<body>
  <h2>通过empty移除元素</h2>
  <div id="test">
    <p>p元素1</p>
    <p>p元素2</p>
  </div>
  <button>点击通过jQuery的empty移除元素</button>
  <script type="text/javascript">
  $("button").on('click', function() {
    //通过empty移除了当前div元素下的所有p元素
    //但是本身id=test的div元素没有被删除
    $("#test").empty()
  })
  </script>
</body>

</html>

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

例如一段节点,绑定点击事件

<div class="hello"><p>这是P段落</p></div>
$('.hello').on("click",fn)

如果不通过remove方法删除这个节点其实也很简单,但是同时需要把事件给销毁掉,这里是为了防止"内存泄漏",所以前端开发者一定要注意,绑了多少事件,不用的时候一定要记得销毁

通过remove方法移除div及其内部所有元素,remove内部会自动操作事件销毁方法,所以使用使用起来非常简单

//通过remove处理
$('.hello').remove()
//结果:<div class="hello"><p>这是P段落</p></div> 全部被移除 //节点不存在了,同事事件也会被销毁

remove表达式参数:

remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点

我们可以通过$()选择一组相同的元素,然后通过remove()传递筛选的规则,从而这样处理

<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title></title>
  <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
  <style>
  .test1 {
    background: #bbffaa;
  }
  
  .test2 {
    background: yellow;
  }
  </style>
</head>

<body>
  <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>

</html>

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

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

empty方法

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

empty不能删除自己本身这个节点

remove方法

该节点与该节点所包含的所有后代节点将同时被删除

提供传递一个筛选的表达式,删除指定合集中的元素

以上就是二者的区别,我们具体通过下边代码部分加深理解

<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title></title>
    <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
  <style>
  .left,
  .right {
    width: 300px;
  }
  
  .left div,
  .right div {
    width: 100px;
    height: 90px;
    padding: 5px;
    margin: 5px;
    float: left;
    border: 1px solid #ccc;
  }
  
  .left div {
    background: #bbffaa;
  }
  
  .right div {
    background: yellow;
  }
  </style>
</head>

<body>
  <h2>通过empty与remove移除元素</h2>
  <div class="left">
    <button id="bt1">点击通过jQuery的empty移除内部P元素</button>
    <button id="bt2">点击通过jQuery的remove移除整个节点</button>
  </div>
  <div class="right">
    <div id="test1">
      <p>p元素1</p>
      <p>p元素2</p>
    </div>
    <div id="test2">
      <p>p元素3</p>
      <p>p元素4</p>
    </div>
  </div>
  <script type="text/javascript">
  $("#bt1").on('click', function() {
    //删除了2个p元素,但是本着没有删除 
    $("#test1").empty()
  })

  $("#bt2").on('click', function() {
    //删除整个节点
    $("#test2").remove()
  })
  </script>
</body>

</html>

以上这篇基于DOM节点删除之empty和remove的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript XML数据显示为HTML一例
Dec 23 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
Nov 13 Javascript
js子页面获取父页面数据示例
May 15 Javascript
jQuery带时间的日期控件代码分享
Aug 26 Javascript
第六章之辅组类与响应式工具
Apr 25 Javascript
Vue.js每天必学之方法与事件处理器
Sep 06 Javascript
如何正确理解javascript的模块化
Mar 02 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
初试vue-cli使用HBuilderx打包app的坑
Jul 17 Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
Nov 10 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 #Javascript
基于bootstrop常用类总结(推荐)
Sep 11 #Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 #jQuery
利用纯js + transition动画实现移动端web轮播图详解
Sep 10 #Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
Sep 10 #Javascript
vue系列之动态路由详解【原创】
Sep 10 #Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 #Javascript
You might like
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
javascript求日期差的方法
2016/03/02 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Python利用IPython提高开发效率
2016/08/10 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
什么是Rollback Segment
2013/04/22 面试题
领导检查欢迎词
2014/01/14 职场文书
工作疏忽检讨书
2014/01/25 职场文书
小学生读书感言
2014/02/12 职场文书
和谐社区口号
2014/06/19 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
2015年行政部工作总结
2015/04/28 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python