对 jQuery 中 data 方法的误解分析

 更新时间:2014年06月18日 14:02:17   投稿:mdxy-dxy  
一直以来都认为新版本中 data 是调用 dataset 实现的,对于低版本IE则采用 getAttribute其实一直是我误解了,也不知道最初这个想法是怎么来的

今天 谢亮 兄弟和我讨论一个东西的时候,谈到了性能,他用的是 attr 操作自定义属性 data-uid,我说用 data 好,因为是 dataset 实现,然后他去翻了下 jQuery 源码和我说,没有发现这个东西,我就纳闷了。于是我去仔细读了下 data 方法的源码,才发现我一直误会了,再此,向之前问我 data 方法的群友道歉,我 "骗" 了你们,你们来打我吧。

今天我就重新解释下 data 方法,先看下 jQuery 1.11.0 的手册里肿么说的吧,请移步至http://shouce.jb51.net/jquery/data.html
用法这里说的很清楚了,但是内部是怎么实现的呢? 戳我看源码  (看不懂没关系,我会简单分析下他的流程)

其实是这样的,当我们执行例如这样的语句时 $("#id").data("test"); (简化后的过程) 
第一步: jQuery 会获取到 $("#id") 元素,对吧、 
第二步: 执行到 data方法 的时候,他会通过 attributes 取我们要的对应值。 
第三步: 返回结果给我们,然后 jQuery 把值缓存到内部对象里 
第一次取的时候,我们可以得到的 undefined,字符串,数字或者解析后的json。 
 
那有人会说这个和 attr 有什么区别呢? 
当我们第二次执行 $("#id").data("test"); 的时候: 
第一步: jQuery 会获取到 $("#id") 元素,和上面一样。 
第二步: 执行到 data方法 的时候,从 jQuery 的缓存中取值 
第三步: 返回结果给我们 
 
发现第二步不同了,对吧,为什么不是从 attributes 取值,而是从缓存中取呢? 
缓存其实是js的对象,简单说就类似 var cache = {}; jQuery 在第一次取值之后就会保存到这个缓存对象中,这样我们再次操作的时候就非常快了、 
往往性能的损耗都是在 dom 操作上,所以避免重复操作 dom 是非常必要的。 
 
到这,也能看出他和 attr 最大的区别了,比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", "123"); 执行后依然是 data-test="hehe"
$("#id").attr("data-test", "123"); 执行后会是 data-test="123"
 
那么我们要给一个元素赋值值,或者对象的时候他们有什么区别呢?比如 <div id="id" data-test="hehe"></div> 
$("#id").data("test", {str: "hehe"}); 会把 {str: "hehe"} 赋值给 缓存,元素节点上依然是 data-test="hehe"
$("#id").attr("data-test", {str: "hehe"}); 执行后会是 data-test="[object Object]"
这个应该也有不少人遇到,至少群里有不少人问过这个问题。

其实我之前也没骗你们,自定义属性没必要老是 attr 他,data 是 jQuery 赋予我们的一把瑞士军刀,非常锋利的。

好了,我是懒人,懒的配图,已经写了不少字了,如果有什么说的不对的地方,你们来打我吧

相关文章

  • jQuery读取本地的json文件(实例讲解)

    jQuery读取本地的json文件(实例讲解)

    下面小编就为大家带来一篇jQuery读取本地的json文件(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • jquery ui sortable拖拽后保存位置

    jquery ui sortable拖拽后保存位置

    这篇文章主要为大家详细介绍了jquery ui sortable拖拽后保存位置的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • jQuery.parseJSON()函数详解

    jQuery.parseJSON()函数详解

    今天小编就为大家分享一篇关于jQuery.parseJSON()函数详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 基于jQuery实现音乐播放试听列表

    基于jQuery实现音乐播放试听列表

    这篇文章主要介绍了基于jQuery实现音乐播放试听列表的相关资料,需要的朋友可以参考下
    2016-04-04
  • jQuery选择器基础入门教程

    jQuery选择器基础入门教程

    这篇文章主要介绍了jQuery选择器基础知识,结合实例分析了jQuery选择器的功能、使用方法与相关操作技巧,需要的朋友可以参考下
    2016-05-05
  • jQuery.validate.js表单验证插件的使用代码详解

    jQuery.validate.js表单验证插件的使用代码详解

    Validate是基于jQuery的一款轻量级验证插件,内置丰富的验证规则,这篇文章主要介绍了jQuery.validate.js表单验证插件的使用代码详解,需要的朋友可以参考下
    2018-10-10
  • jQuery Easyui实现左右布局

    jQuery Easyui实现左右布局

    jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件。接下来通过本文给大家介绍jQuery Easyui实现左右布局,涉及到到easyui左右布局相关知识,感兴趣的朋友一起学习吧
    2016-01-01
  • jQuery菜单实例(全选,反选,取消)

    jQuery菜单实例(全选,反选,取消)

    下面小编就为大家带来一篇jQuery菜单实例(全选,反选,取消)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • jQuery的ajax和遍历数组json实例代码

    jQuery的ajax和遍历数组json实例代码

    下面小编就为大家带来一篇jQuery的ajax和遍历数组json实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • jQuery插件Skippr实现焦点图幻灯片特效

    jQuery插件Skippr实现焦点图幻灯片特效

    Skippr 是一个超级简单的 jQuery 幻灯片插件。只是包括你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了。Skippr 能够自适应窗口宽度,而且导航是独特的条形导航。
    2015-04-04

最新评论