详解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 相关文章推荐
JavaScript聚焦于第一个字段的代码
Oct 15 Javascript
js中indexof的用法详细解析
Dec 24 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
canvas实现爱心和彩虹雨效果
Mar 09 Javascript
node通过express搭建自己的服务器
Sep 30 Javascript
javascript动态创建对象的属性详解
Nov 07 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
Dec 06 Javascript
基于javascript实现放大镜特效
Dec 03 Javascript
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 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去除HTML标签实例
2013/11/06 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
jquery 插件 人性化的消息显示
2008/01/21 Javascript
Mootools 1.2教程 输入过滤第二部分(字符串)
2009/09/15 Javascript
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
django迁移文件migrations的实现
2020/03/31 Python
如何编写python的daemon程序
2021/01/07 Python
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
上海微创软件面试题
2012/06/14 面试题
主题酒店策划书
2014/01/28 职场文书
勤俭节约倡议书
2014/04/14 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
活动总结新闻稿
2014/08/30 职场文书
干部考察材料范文
2014/12/24 职场文书
五年级学生期末评语
2014/12/26 职场文书
回复函格式及范文
2015/07/14 职场文书
爱国主义主题班会
2015/08/14 职场文书
2016党校学习心得体会
2016/01/07 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
三年级作文之小小梦想
2019/12/06 职场文书