当前位置: 首页 > 编程笔记 >

对 jQuery 中 data 方法的误解分析

陈弘厚
2023-03-14
本文向大家介绍对 jQuery 中 data 方法的误解分析,包括了对 jQuery 中 data 方法的误解分析的使用技巧和注意事项,需要的朋友参考一下

今天 谢亮 兄弟和我讨论一个东西的时候,谈到了性能,他用的是 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 赋予我们的一把瑞士军刀,非常锋利的。

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

 类似资料:
  • 本文向大家介绍JS JQuery获取data-*属性值方法解析,包括了JS JQuery获取data-*属性值方法解析的使用技巧和注意事项,需要的朋友参考一下 下面就详细介绍四种方法获取data-*属性的值 <li id="getId" data-id="122" data-vice-id="11">获取id</li> 需要获取的就是data-id 和 dtat-vice-id的值 一:getAt

  • 本文向大家介绍jQuery中deferred对象使用方法详解,包括了jQuery中deferred对象使用方法详解的使用技巧和注意事项,需要的朋友参考一下 在jquery1.5之后的版本中,加入了一个deferred对象,也就是延迟对象,用来处理未来某一时间点发生的回调函数。同时,还改写了ajax方法,现在的ajax方法返回的是一个deferred对象。 那就来看看deferred对象的用法。 1

  • 本文向大家介绍jQuery中.attr()和.data()的区别分析,包括了jQuery中.attr()和.data()的区别分析的使用技巧和注意事项,需要的朋友参考一下 $.attr()和$.data()本质上属于 DOM属性 和 Jquery对象属性 的区别。 Jquery对象属性和DOM属性 一个简单的例子 • $.attr()每次都从DOM 元素 中取属性的值,即和视图中标签内的属性值保持

  • 本文向大家介绍jquery中attr、prop、data区别与用法分析,包括了jquery中attr、prop、data区别与用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery中attr、prop、data区别与用法。分享给大家供大家参考,具体如下: 在高版本的jquery中获取标签的属性,可以使用attr()、prop()、data(),那么这些方法有什么区别呢? 对于

  • 本文向大家介绍jQuery中delegate()方法的用法详解,包括了jQuery中delegate()方法的用法详解的使用技巧和注意事项,需要的朋友参考一下 delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。下面我们具体来了解一下。 语法结构: 代码如下: 参数说明: childSelector 必需。规定要附加事件处理程

  • 本文向大家介绍Ajax中解析Json的两种方法对比分析,包括了Ajax中解析Json的两种方法对比分析的使用技巧和注意事项,需要的朋友参考一下 eval();  //此方法不推荐 JSON.parse();  //推荐方法 一、两种方法的区别 我们先初始化一个json格式的对象: 然后在控制台调用:   console.log( jsonObj.name );  // 两种方法都可以正确输入 周星