详解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中,为什么要尽可能使用局部变量?
Apr 06 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
Dec 07 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
Nov 30 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
JS+Canvas绘制动态时钟效果
Nov 10 Javascript
AngularJS 表单验证手机号的实例(非必填)
Nov 12 Javascript
mpvue写一个CPASS小程序的示例
Sep 04 Javascript
分享5个好用的javascript文件上传插件
Sep 16 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 Javascript
javascript实现雪花飘落效果
Aug 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
日本十大惊悚动漫
2020/03/04 日漫
php 设计模式之 单例模式
2008/12/19 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
ansible作为python模块库使用的方法实例
2017/01/17 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
QQ空间主人寄语大全
2014/04/12 职场文书
团日活动总结怎么写
2014/06/25 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
财政局个人总结
2015/03/04 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书