详解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 chrome浏览器判断代码
Mar 28 Javascript
jsp网页搜索结果中实现选中一行使其高亮
Feb 17 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
微信小程序通过保存图片分享到朋友圈功能
May 24 Javascript
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
了解javascript中变量及函数的提升
May 27 Javascript
JS实现音量控制拖动
Jan 15 Javascript
微信小程序实现分页加载效果
Nov 19 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中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP进程通信基础之信号
2017/02/19 PHP
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
浅谈Angular路由守卫
2017/08/26 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
用vue写一个日历
2020/11/02 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Python tkinter三种布局实例详解
2020/01/06 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
大学生求职信例文
2014/06/29 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
公司车辆管理制度
2015/08/04 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android