代码之家  ›  专栏  ›  技术社区  ›  kazanaki

jquery.data()是如何工作的?

  •  54
  • kazanaki  · 技术社区  · 14 年前

    我想用 .data() 在我的申请中。这个 examples 是有帮助的,但是我不知道这些值存储在哪里。

    我用firebug检查网页,当.data()将对象保存到dom元素时,我看不到 任何 firebug中的更改(html或dom选项卡)。

    我试图查看jquery的源代码,但它对于我的javascript知识来说非常先进,我迷失了自我。

    所以问题是:

    jquery.data()存储的值实际上去了哪里?我能用工具检查/定位/列出/调试它们吗?

    3 回复  |  直到 7 年前
        1
  •  39
  •   Matt    14 年前

    看看 source 为了它。

    从一个快速的一瞥,它看起来像是在存储数据 cache 在第2行创建的变量。

    编辑:

    下面是一个在缓存中查找数据的快速演示: http://jsfiddle.net/CnET9/

    你也可以倾倒 $.cache 到您的控制台并手动浏览。

        2
  •  6
  •   Community Neeleshkumar S    7 年前

    你似乎已经得到了哪里的答案,但这里有一点关于如何。 在使用之前,您应该了解一些规则。

    添加

    使用$('.selector').data()返回的对象添加变量是有效的,因为数据对象是通过引用传递的,所以无论在何处添加属性,都会添加它。如果对另一个元素调用data(),则它将被更改。这就是它的本来面目…

    var oData = $('#id').data();
    oData.num = 0;
    oData.num == $('#id').data().num; // true
    

    添加一个对象会将一个对象放在数据对象的内部,并“扩展以前与该元素一起存储的数据”。- http://api.jquery.com/data/#entry-longdesc

    这意味着将obj添加到dataobj

    oData.obj = {};    
    oData === { /*previous data*/, obj : { } }
    

    添加数组不会扩展先前存储的数据,但其行为也与简单值不同…

    使用

    如果您存储了简单的值,则可以将它们放入变量中,并在不更改数据对象的情况下对它们执行所需的操作。

    然而

    如果使用对象或数组在元素上存储数据,请小心!

    仅仅因为将其存储到变量中并不意味着不更改数据值。 仅仅因为你把它传递给一个函数并不意味着你没有改变数据值!

    这就是它的本来面目。除非很简单…那只是一份拷贝。P

    var data             = $("#id").data();  // Get a reference to the data object 
    data.r_redirect      = "index.php";      // Add a string value
    data.num             = 0;                // Add a integer value
    data.arr             = [0,1,2];          // Add an array
    data.obj             = { a : "b" };      // Add an object
    
                                             // but here is where the fun starts! 
    
    var r_redirectString = data.r_redirect;  // returns "index.php", as expected.. cool
    r_redirectString     = "changed"         // change the value and the compare :
    data.r_redirect      == r_redirectString // returns false, the values are different
    
    var oArr             = data.arr;         // Now lets copy this array
    oArr.push(3);                            // and modify it.
    data.arr            == oArr              // should be false? Nope. returns true.
                                             // arrays are passed by reference.
                                             // but..
    
    var oObj             = data.obj          // what about objects?       
    oObj["key"]          = "value";          // modify the variable and
    data.obj["key"]     == oObj["key"]       // it returns true, too!
    

    所以,资源…

    What's the best way to store multiple values for jQuery's $.data()? https://stackoverflow.com/a/5759883/1257652

        3
  •  4
  •   Nick Craver    14 年前

    你只要打个电话就可以检查一下 .data() 没有参数,就像这样:

    $("div").data("thing", "value");​​​​​​
    console.log($("div").data());
    //or...
    console.log($.data($("div").get(0)));
    

    至于“where”,它存储在表示元素的键下的全局jquery缓存对象中。打电话 .data() 真正的回报 jQuery.data(yourDomElement) ,或者,如果从中调用特定值,则在其上附加一个键。