详解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功能函数代码
Jun 23 Javascript
js 操作select相关方法函数
Dec 06 Javascript
js内置对象 学习笔记
Aug 01 Javascript
如何学习Javascript入门指导
Nov 01 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
简单实现jQuery弹幕效果
May 06 jQuery
vue-cli3.0配置及使用注意事项详解
Sep 05 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
小程序实现层叠卡片滑动效果
Aug 26 Javascript
vue 对axios get pust put delete封装的实例代码
Jan 05 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
如何过滤高亮显示非法字符
2006/10/09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
python 运算符 供重载参考
2009/06/11 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
化学专业毕业生自荐信
2013/11/15 职场文书
诉前财产保全担保书
2014/05/20 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
关于召开会议的通知
2015/04/15 职场文书
刮痧观后感
2015/06/05 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python