jQuery.data()方法与内存泄漏(2)
作者:dishuipiaoxiang 来源:Denis'Blog 发布时间:2010-04-06 17:20:00
标签:jQuery,内存,泄露
为了避免类似的情况出现,我们用hasOwnProperty来检索自己的数据对象。这样childA的值将不会向上广播到原型链,也就不能继承父对象的值。事实上,避免使用hasOwnProperty来读取数据,也只有个在对象不具有该数据时才返回父对象的值。
另外一种方法是将数据存储到本地对象自身中,但是,它不能返回数据对象,因为该对象不存在,如:
// ...
if ( elem.nodeType ) {
dataObject[ name ] = value;
} else {
elem[ expando +"_" + name ] = value;
}
// ...
robert.katic 推崇第一种方法,并重写了$.data()和$.removeData()方法.
(function($){
var expando = "jQuery" + (new Date).getTime(),
hasOwnProperty = Object.prototype.hasOwnProperty,
_data = $.data,
_removeData = $.removeData;
$.data = function( obj, name, data ) {
if ( obj.nodeType ) {
return _data( obj, name, data );
}
var thisCache, hasCache = hasOwnProperty.call( obj, expando );
if ( !hasCache && typeof name === "string" && data === undefined ) {
return undefined;
}
if ( typeof name === "object" ) {
obj[ expando ] = $.extend(true, {}, name);
} else if ( !hasCache ) {
obj[ expando ] = {};
}
thisCache = obj[ expando ];
if ( typeof name === "string" ) {
if ( data !== undefined ) {
thisCache[ name ] = data;
}
return thisCache[ name ];
}
return thisCache;
};
$.removeData = function( obj, name ) {
if ( obj.nodeType ) {
return _removeData( obj, name );
}
if ( name ) {
if ( hasOwnProperty.call( obj, expando ) ) {
delete obj[ expando ][ name ];
if ( $.isEmptyObject( obj[expando] ) ) {
delete obj[ expando ];
}
}
} else {
delete obj[ expando ];
}
};
})(jQuery);
jQuery是一个很优秀的库,但是有时也免会有一些小瑕疵。而这些小瑕疵正是我们在使用时要特别小心。非常感谢robert.katic为我们详细的分析了该方法的缺陷。
参考资料:http://forum.jquery.com/topic/data-object-and-memory-leak


猜你喜欢
- 记忆力差的孩子得勤做笔记!刚接触python,最近又需要画一个三维图,然后就找了一大堆资料,看的人头昏脑胀的,今天终于解决了!好了,废话不多
- 开发人员有时候使用类似下面SQL将字符串转换为日期时间类型,乍一看,这样的SQL的写法是没有什么问题的。但是这样的SQL其实有时候就是一个定
- 本文主要介绍如何用Python设计一个经典小游戏:猜大小。在这个游戏中,将用到前面我介绍过的所有内容:变量的使用、参数传递、函数设计、条件控
- 本文实例讲述了php实现的一段简单概率相关代码。分享给大家供大家参考,具体如下:<?phpfor($i=1;$i<100000;
- 一.问题描述当我们在做项目的时候,创建一张用户表,如何让该表的主键id从0开始自增?网上搜索了很多解决方案,最后发现了一种方法必实现且有效的
- 项目总览创建虚拟环境mkvirtualenv meiduo_malls创建项目django-admin startproject meidu
- 前言第一次处理视频素材可以手动用剪映来处理,然后再用代码进行自动化处理,不然连朝哪个方向自动化处理可能都不知道那清楚处理流程之后,怎么用Py
- 人脸识别正在成为软件开发中的一种趋势。它有助于识别人脸并使应用程序更加健壮。在本教程中,我们将使用python和face_recogniti
- 1. 列表1.1 复制浅拷贝list_1 = [1, [22, 33, 44], (5, 6, 7), {"name":
- 用法分析 在查看SRGAN源码时有如下损失函数,其中设置了retain_graph=True,其作用是什么?################
- 这篇文章主要介绍了Python计算不规则图形面积算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 一、TCP1、tcp服务器创建#创建服务器from socket import *from time import ctime #导入cti
- redux-saga在学习它之前先了解es6生成器生成器关键字:yield next()定义函数需要在函数名前急+*号function *t
- 搭建环境:操作系统:Win10 64bitPython版本:3.7Pycharm:社区免费版一、Python3.7安装下载链接:官网http
- python脚本执行的3种方法:(找到自己能够使用的方法,能用的方法就是好方法)方法一:交互模式直接执行语句交互模式下直接编写执行 Pyth
- 在应用SA-FileUp时,必须确认用户已对目的路径有读、写、删除的权力。在多文件上传中,由于浏览器不支持SIZE= 属性,所以对多文件的情
- 后边要做一个微信小程序,并要能获取用户微信绑定的手机号码。而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返
- 实际上在python中用列表就可以实现动态变量名的管理,python中的列表中可以存储任何类型的元素:listA = [0,"st
- Python编程中类的概念可以比作是某种类型集合的描述,如“人类”可以被看作一个类,然后用人类这个类定义出每个具体的人——你、我、他等作为其
- 在服务器上,通常为了快速登录数据库,我们会使用mysql -hhost -uusername -ppassword db的方式登录数据库,如