详解jQuery中的empty、remove和detach


Posted in Javascript onApril 11, 2016

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

详解jQuery中的empty、remove和detach

三者都有把元素移除的作用,但细微的差别,造就了它们的使命不同。

最权威的解释当然是jQuery_API咯,下面是API中关于他三儿的部分截取。

一、empty:

This method removes not only child (and other descendant) elements, but also any text within the set of matched elements. This is because, according to the DOM specification, any string of text within an element is considered a child node of that element.To avoid memory leaks, jQuery removes other constructs such as data and event handlers from the child elements before removing the elements themselves. If you want to remove elements without destroying their data or event handlers (so they can be re-added later), use .detach() instead.

注意:加粗的部分,通过empty移除后代元素,会移除其事件的。

为什么呢?

防止内存泄露!!!

二、remove:

Similar to .empty(), the .remove() method takes elements out of the DOM. Use .remove() when you want to remove the element itself, as well as everything inside it. In addition to the elements themselves, all bound events and jQuery data associated with the elements are removed. To remove the elements without removing data and events, use .detach() instead.

remove和empty方法一样,都会移除元素的事件句柄,从而避免内存泄露。

区别:remove包含了移除事件本身,而empty是后代元素。

三、detach:

从empty和remove的介绍中(英文斜体部分),可以或多或少得知,detach是不会移除事件句柄的。

那么我们再来看看详细的API讲解:

The .detach() method is the same as .remove(), except that .detach() keeps all jQuery data associated with the removed elements. This method is useful when removed elements are to be reinserted into the DOM at a later time.

咦,什么意思?

看了detach的注解,不知道大家有没有眼前一亮,detach不能用来删除废弃的元素。

为什么呢?

因为它保留了事件驱动嘛,这样不就会造成内存泄露么。

所以要删除以后不再利用的元素时,使用empty或者remove。

那要detach有何用?

用处大了。

当我们要对一个元素进行大规模的增删改的时候,我们可以用detach将这个元素提取出来,然后在这个元素上进行操作,而不是在整个dom文档中进行操作。

好处就是:减少对整个dom文档的修改,从而减少页面重绘;而且对整个dom文档进行操作,在ie下还可能会造成内存泄露哦。所以稳妥起见,还是利用detach这一神器吧。

下面是一个demo,首先对#container元素绑定click事件(事件委托),然后利用detach将其脱离文档,然后再创建两个child元素,追加到#container元素中,最后将#container重新添加到body后。

<!DOCTYPE html> 
<head>
<title>jQuery</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
div.monkey, #container {
width:120px;
height:120px;
line-height:60px;
}
div.monkey {
border:1px solid black;
} 
</style>
</head>
<body>
<div class="monkey"> </div>
<div id="container"> </div>
<script src="jquery-1.12.0.js"></script>
<script>
$(function(){
//事件代理
$('#container').on('click',function( event ){
console.log( $(event.target).text() );
});
//利用detach将container从dom文档中剥离开
var container = $('#container').detach();
var child1 = '<div>I am Monkey</div>';
var child2 = '<div>Monkey is me</div>';
//将child1、child2插入container中
$(container).append( child1 )
.append( child2 );
//将container重新插入body中 
$('body').append( container );
}); 
</script>
</body>
</html>

以上所述是小编给大家介绍的jQuery中的empty、remove和detach的区别,希望对大家有所帮助!

Javascript 相关文章推荐
js 图片缩放(按比例)控制代码
May 27 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
node.js中的fs.realpath方法使用说明
Dec 16 Javascript
javascript实现Table排序的方法
May 15 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
Angular.js中$apply()和$digest()的深入理解
Oct 13 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
jQuery实现模糊搜索功能的方法分析
Jun 29 jQuery
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
基于openlayers实现角度测量功能
Sep 28 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 Javascript
JQuery导航菜单选择特效
Apr 11 #Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 #Javascript
javascript冒泡排序小结
Apr 10 #Javascript
javascript原生ajax写法分享
Apr 10 #Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 #Javascript
jQuery实现点击水纹波动动画
Apr 10 #Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 #Javascript
You might like
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
遗传算法之Python实现代码
2017/10/10 Python
django中的setting最佳配置小结
2017/11/21 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
深入分析python 排序
2020/08/24 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
简述数组与指针的区别
2014/01/02 面试题
什么是规则表达式
2012/05/03 面试题
J2EE包括哪些技术
2016/11/25 面试题
金融专业大学生自我评价
2014/01/09 职场文书
师德个人剖析材料
2014/02/02 职场文书
函授生自我鉴定
2014/03/25 职场文书
辩护词范文大全
2015/05/21 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
MySQL分区表管理命令汇总
2022/03/21 MySQL