详解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从头学起第四讲 jquery入门教程
Aug 01 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
May 27 Javascript
JavaScript中的replace()方法使用详解
Jun 06 Javascript
基于javascript实现单选及多选的向右和向左移动实例
Jul 25 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
Jun 03 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
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测试成功的邮件发送案例
2015/10/26 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
python根据日期返回星期几的方法
2015/07/06 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python实现飞机大战项目
2020/03/11 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
WiFi云数码相框:Nixplay
2018/07/05 全球购物
刚毕业大学生自荐信范文
2014/02/20 职场文书
地理教师岗位职责
2014/03/16 职场文书
运动会开幕式主持词
2014/03/28 职场文书
房屋转让协议书
2014/04/11 职场文书
机械专业求职信范文
2014/07/15 职场文书
部门2015年度工作总结
2015/04/29 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers