jQuery数据缓存方案详解:$.data()的使用

我们经常使用隐藏控件或者是js全局变量来临时存储数据,全局变量容易导致命名污染,隐藏控件导致经常读写dom浪费性能。jQuery提供了自己的数据缓存方案,能够达到和隐藏控件、全局变量相同的效果,但是jQuery实现方式更优雅。为了更好地使用jQuery数据缓存方案,我们需要掌握$.data()、$.cache、$.expando、$.hasData()、$.removeData()。

$.hasData()用来判断某个对象是否有附加的属性,可以给任何JavaScript对象和HTMLElement对象附加属性。$.data()用来读取或者修改属性值。$.removeData()用来删除已经添加的属性,这是为了释放内存,避免过多无用属性浪费内存。

[javascript] view plain copy

  1. var myObj = {};
  2. // hasData用来判断HTMLElement或JS对象是否具有数据
  3. console.log(jQuery.hasData($("#a")));// false
  4. // data()添加属性
  5. $.data(myObj, ‘name‘, ‘aty‘);
  6. console.log(jQuery.hasData(myObj));// true
  7. // data()读取属性
  8. console.log($.data(myObj, ‘name‘));//aty
  9. // removeData删除属性
  10. $.removeData(myObj, ‘name‘);
  11. console.log($.data(myObj, ‘name‘));//undefined
  12. // 如果所有属性都被删除,那么hasData返回false
  13. console.log(jQuery.hasData(myObj));// false

给HTMLElement对象添加属性,使用方式跟为普通js对象添加属性一模一样。

[html] view plain copy

  1. <div id="content"></div>
  2. <script>
  3. var el = document.getElementById(‘content‘);
  4. $.data(el, ‘name‘, ‘aty‘);
  5. console.log($.data(el, ‘name‘)); // aty
  6. </script>

可以看到使用jQuery数据缓存的API是很容易的,现在我们要大致看下jQuery是如何实现缓存方案。为普通JS对象提供缓存时,jquery直接将数据保存在原始的JS对象上。此时会偷偷的给JS对象添加个属性(类似于jQuery16101803968874529044),属性值也是一个对象。

[javascript] view plain copy

  1. var myObj = {};
  2. $.data(myObj, ‘name‘, ‘aty‘);
  3. console.log(myObj);
  4. console.log($.expando);

我们可以看到myObj结构发生了变化:jquery给普通对象偷偷添加的属性名称其实就是$.expando。

jQuery.expando是一个字符串,使用Math.random生成,去掉了非数字字符。它作为HTMLElement或JS对象的属性名。页面引入jQuery框架的时候,会随机生成一个字符串。

[javascript] view plain copy

  1. expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),

现在我们知道了jQuery如何给普通对象添加属性,以及expando的含义,那么我们就可以通过下面的代码获取添加的属性。

[javascript] view plain copy

  1. var hisObj = {};
  2. $.data(hisObj, ‘name‘, ‘him‘);
  3. console.log(hisObj[jQuery.expando].data.name);//him

为HTMLElement提供缓存时,却不会直接保存在HTMLElement上。而是保存在jQuery.cache这个全局对象上。此时先给HTMLElement添加属性(jQuery.expando),属性值为数字(1,2,3递增)。即只将一些数字保存在了HTMLElement上,不会直接将数据置入。这是因为IE老版本中可能会存在内存泄露危险。而HTMLElement如何与jQuery.cache建立联系呢? 还是id。刚刚提到属性值数字就是id。

[html] view plain copy

  1. <div id="a"></div>
  2. <script>
  3. var dom = document.getElementById("a");
  4. $.data(dom, ‘name‘, ‘aty‘);
  5. console.log(dom[jQuery.expando]); // 1
  6. console.log(jQuery.cache); // {1 : {data:{name:‘aty‘}}}
  7. </script>


知道了jQuery如何为dom对象添加属性,我们就可以通过下面的代码获取属性。

[javascript] view plain copy

  1. console.log(jQuery.cache[dom[jQuery.expando]].data.name);

现在我们看下DOM对象和jQuery封装后的对象有什么区别。

[javascript] view plain copy

  1. // 给dom元素添加数据
  2. var dom = document.getElementById("a");
  3. $.data(dom, ‘name‘, ‘aty‘);
  4. console.log(jQuery.hasData(dom));//true
  5. console.log($.data(document.getElementById("a"), ‘name‘));//aty
  6. console.log($.data($("#a")[0], ‘name‘));//aty
  7. // 给jquery包装后的dom附加对象
  8. var $dom = $("#a");
  9. $.data($dom, ‘age‘, ‘25‘);
  10. console.log(jQuery.hasData($dom));//true
  11. console.log($.data($dom, ‘age‘));//25
  12. console.log($.data($("#a"), ‘age‘));//undefined


这是因为本质区别在于:原始的DOM对象会被jQuery特殊对待,而jQuery包装后的对象与普通JS对象无异。通过jQuery选择器每次获取的对象并不是同一个对象

[javascript] view plain copy

  1. var $dom = $("#a");
  2. $.data($dom, ‘age‘, ‘25‘);
  3. // dom对象支持多次获取,jQuery对象不支持
  4. console.log( document.getElementById("a") ===  document.getElementById("a"));///true
  5. console.log( document.getElementById("a") ===  $("#a")[0]);///true
  6. console.log($("#a") ===  $("#a"));//false
  7. // jQuery包装后的对象,与普通javascript对象无异
  8. console.log($dom[jQuery.expando].data.age);//25

最后再提一下,可以使用$.data获取某个对象上附加的所有属性。

[javascript] view plain copy

    1. var $dom = $("#a");
    2. $.data($dom, ‘age‘, ‘25‘);
    3. console.log($.data($dom));//Object {age: "25"}

参考文章:

读jQuery之六(缓存数据)

http://www.cnblogs.com/weihengblogs/p/6093067.html

时间: 2024-12-29 23:20:22

jQuery数据缓存方案详解:$.data()的使用的相关文章

jquery源码解析:jQuery数据缓存机制详解1

jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等.对于json这种数据量大的,就适合用data方法来添加,而data方法就是jQuery缓存机制最重要的方法. jQuery中为什么要用缓存机制系统呢?因为DOM元素与js对象之间互相引用,在大部分浏览器下会引起内存泄漏.为了解决这个问题,jQuery就写了一个缓存机制系统.举个例子: var di

HTML5数据存储方案data与jQuery数据存储方案$.data()的区别

我们先看下$.fn.data()的使用,这个和$.data()是不一样的,前者是和某个jquery对象相关,后者则是全局方法.主要有data()和removeData()这2个实例方法.通过下面的例子和执行结果可以看到:$.fn.data()和$.fn.removeData()跟$.data的使用方式没有什么差别. // 支持任何数据类型 2. $( "body" ).data( "name", "xx" ); 3. $( "body&

jQuery数据缓存data(name, value)详解及实现

一. jQuery数据缓存的作用 jQuery数据缓存的作用在中文API中是这样描述的:“用于在一个元素上存取数据而避免了循环引用的风险”.如何理解这句话呢,看看我下面的举例,不知道合不合适,如果你有更好的例子可以告诉我. (1) 存在循环引用风险的例子(注意getDataByName(name)方法中的for in语句): <a href="javascript:void(0);" onclick="showInfoByName(this.innerHTML);&qu

jQuery源代码学习之六——jQuery数据缓存Data

一.jQuery数据缓存基本原理 jQuery数据缓存就两个全局Data对象,data_user以及data_priv; 这两个对象分别用于缓存用户自定义数据和内部数据: 以data_user为例,所有用户自定义数据都被保存在这个对象的cache属性下,cache在此姑且称之为自定义数据缓存: 自定义数据缓存和DOM元素/javascript对象通过id建立关联,id的查找通过DOM元素/javascript元素下挂载的expando属性获得 话不多说,直接上代码.相关思路在代码注释中都有讲解

数据缓存方案

数据缓存方案 by 伍雪颖 今天考虑一个适合自己项目的缓存方案,基本都实验了下(以前一直用CoreData) 1.coredata,用MagicalRecord+Mogenerator 要建表,还要写好多解析代码,果断不用,好麻烦 2.序列化 [NSKeyedArchiver archiveRootObject:model toFile:path]; [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 好方便,不过总感觉体验不好,测了下方法时间,当

CentOS 6.5 MySQL/MariaDB数据备份与恢复备份详解

MySQL/MariaDB数据备份与恢复备份 数据对我们来说再重要不过了,那我们如何做到对数据尽可能的安全呢,当我们的数据丢失了那又该怎么做呢,所以说数据备份对我们的数据安全性来说太重要了. 数据对我们来说再熟悉不过了,也最平常不过了,我们每天都在接触各色各样的数据,数据记录了我们平常相关的业务信息,所以数据对于我们来说是很重要的,这么重要的数据如果我们的数据丢失了那我们是不是相关的业务都没法进行了呢,这应该是个很麻烦的问题,那我们怎么保护我们的数据的安全呢,这就要用到我们的数据备份了. 如何执

jQuery插件制作方法详解

jQuery插件制作方法详解 jquery插件给我的感觉清一色的清洁,简单.如Jtip,要使用它的功能,只需要在你的元素的class上加 上Jtip,并引入jtip.js及其样式即可以了.其他事情插件全包.我喜欢jquery的一个重要原因是发现她已经有了很多很好,很精彩的插件.写一 个自己的jQuery插件是非常容易的,如果你按照下面的原则来做,可以让其他人也容易地结合使用你的插件. jquery插件给我的感觉清一色的清洁,简单.如Jtip,要使用它的功能,只需要在你的元素的class上加上Jt

触碰jQuery:AJAX异步详解

触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和XHTML来表示. 2)   使用DOM模型来交互和动态显示. 3)   使用XMLHttpRequest来和服务器进行异步通信. 4)   使用javascript来绑定和调用.

Redis for Windows(C#缓存)配置文件详解

Redis for Windows(C#缓存)配置文件详解 前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehyok/p/3478282.html.当然我也在上一篇中指定过配置文件,并且修改其中的端口port.本文将主要来探讨redis强大的配置文件. 我现在使用的redis版本为2.6.首先奉上配置文件的源文件. # Redis configuration file example # Note on unit