详解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 相关文章推荐
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
Javascript 跨域访问解决方案
Feb 14 Javascript
HTML 自动伸缩的表格Table js实现
Apr 01 Javascript
javascript奇异的arguments分析
Oct 20 Javascript
js中数组Array的一些常用方法总结
Aug 12 Javascript
LABjs、RequireJS、SeaJS的区别
Mar 04 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
jQuery网页定位导航特效实现方法
Dec 19 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
Vuex中实现数据状态查询与更改
Nov 08 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
使用Python函数进行模块化的实现
2019/11/15 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
详解Python yaml模块
2020/09/23 Python
信息部岗位职责
2013/11/12 职场文书
大学生自荐书范文
2013/12/10 职场文书
高中军训感想800字
2014/02/23 职场文书
师范生求职自荐信
2014/06/14 职场文书
远程培训的心得体会
2014/09/01 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书