详解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 相关文章推荐
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
Dec 25 Javascript
js实现缓冲运动效果的方法
Apr 10 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
js实现文本框输入文字个数限制代码
Dec 25 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
vue.js 表格分页ajax 异步加载数据
Oct 18 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
Feb 05 Javascript
jQuery插件echarts去掉垂直网格线用法示例
Mar 03 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
php实现单链表的实例代码
2013/03/22 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
jQuery选择器全面总结
2014/01/06 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
python正则表达式re模块详解
2014/06/25 Python
Python判断操作系统类型代码分享
2014/11/22 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Python 私有化操作实例分析
2019/11/21 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
自动化专业职业生涯规划书范文
2014/01/16 职场文书
简历里的自我评价
2014/01/31 职场文书
聚美优品励志广告词
2014/03/14 职场文书
爱心捐款倡议书
2014/04/14 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
2015年工会工作总结
2015/03/30 职场文书
教师节联欢会主持词
2015/07/04 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技