jQuery教程:data()方法避免内存泄露问题

2016-02-20 01:06 50 1 收藏

今天图老师小编要向大家分享个jQuery教程:data()方法避免内存泄露问题教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - Web开发 】

jQuery的官方文档中,提示用户这是一个低级的方法,应该用.data()方法来代替。$.data( element, key, value )可以对DOM元素附加任何类型的数据,但应避免循环引用而导致的内存泄漏问题,原文如下:

The jQuery.data() method allows us to attach data of any type to DOM elements in a way that is safe from circular references and therefore from memory leaks. We can set several distinct values for a single element and retrieve them later:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

但对于该方法,存在的问题也不仅于此。在JQUERY FORUM中 ,对该问题作了深入的讨论,robert.katic 提出了一条解决方案。$.data()方法应用到宿主对象上,运行会得到优化,但在本地对像上使用该方法,结果未必尽如人意。一个元素在正常情况下可以使用.remove()方法将其删除,并清除各自的数据。但对于本地对象而言,这是不能彻底删除的,这些相关的数据一直持续到窗口对象关闭。同样,这些问题也存在于event 对象中,因为事件处理器(handlers)也是用该方法来存储的。

那么,要解决该问题最简单的方法是将数据存储到本地对象新增的一个属性之中。即:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

// ...
if ( elem.nodeType ) { 
        cache[ id ] = dataObject; 
        elem[ expando ] = id;
} else { 
        elem[ expando ] = dataObject;
}
// ...

但是,一旦涉及到继承问题,该方法就无能为力。试看:

var parent = {};
var childA = Object.create( parent );
var childB = Object.create( parent ); 
 
$.data( parent, "foo", "parent value" ); 
 
// This may even be intentional
$.data( childA, "foo" ) 
// = "parent value"
$.data( childB, "foo" ) 
// = "parent value" 
 
// This may NOT be intentional
$.data( childA, "foo", "childA value" );
$.data( parent, "foo" ) 
// = "childA value"
$.data( childB, "foo" ) 
// = "childA value"

开始时,存储数据的对象不存在,因此创建一个对象来存储新的值,如图

现在,我们尝试去修改对象childA同样的数据。

对象childA并不存在该数据,因此它沿着原型链向上查找,父对象刚好拥有该数据,其值立即被改写。所以,从parent和childB这两个对象获取foo的值,得到的将是childA value,而不是parent value。

来源:http://www.tulaoshi.com/n/20160220/1633266.html

延伸阅读
标签: Web开发
作为一名程序员,一提到“缓存”你很容易联想到“客户端(浏览器缓存)”和“服务器缓存”。客户端缓存是存在浏览者电脑硬盘上的,即浏览器临时文件夹,而服务器缓存是存在服务器内存中,当然在一些高级应用场合也有专门的缓存服务器,甚至有利用数据库进行缓存的实现。当然这些都不在本文的讨论范围,本文要讨论的是最流行的JavaScript框架jQue...
标签: Web开发
这是以前整理的一些代码,与JQer分享,希望对大家能有些帮助。 话说功能愈发强大的JQuery体积也不再小巧,55k(Minified)的大小虽然不能说很大,但如果用在一些小型项目或网站上,也不算小,那么我们何不根据自己项目特点,简化或改写JQuery呢,Follow me! 首先是JQuery的核心代码:代码: //不完全一致,但实现手段大致如此 (function(){ &n...
标签: Web开发
首先,jQuery 是什么? jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多javascript高手加入其team,包括来自德国的Jörn Zaefferer,罗马尼亚的Stefan Petre等等。 jQuery是继prototype之后又一个优秀的Javascrīpt框架。其宗旨是WRITE LESS,DO MORE,写更少的代码,做更多的事情。 有什么作用? 它是轻量级的js库(压缩...
    为了速度和正确性,请对齐你的数据.     概述:对于所有直接操作内存的程序员来说,数据对齐都是很重要的问题.数据对齐对你的程序的表现甚至能否正常运行都会产生影响.就像本文章阐述的一样,理解了对齐的本质还能够解释一些处理器的"奇怪的"行为. 内存存取粒度    程序员通常倾向于认为内存就像一个...
标签: Web开发
大家先不要看我的源代码,看看使用js是否能够做得出 要求: 1)页面上一个按钮; 2)点击后弹出窗口,我被点击了; 如下图: JavaScript代码如下:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http://www.w3.or...

经验教程

27

收藏

37
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部