54 votes

Comment fonctionne jQuery .data ()?

Mon Javascript connaissances sont assez limitées.

Au lieu de demander à plusieurs javascript questions j'ai eu le "message" de débordement de Pile et a commencé à l'aide de jQuery immédiatement pour me sauver du temps.

Cependant, plusieurs fois je n'ai pas de comprendre la "magie" derrière jQuery et j'aimerais apprendre les détails.

Je veux utiliser .de données() dans mon application. Les exemples sont très utiles. Je ne comprends pas, toutefois , OÙ ces valeurs sont stockées.

Je inspecter la page avec Firebug et dès que .de données() enregistre un objet à un élément du dom, je ne vois aucun changement dans Firebug (HTML ou Dom onglets).

J'ai essayé de regarder jQuery source, mais il est très en avance pour mon Javascript connaissances et je me suis perdu.

La question est donc:

D'où viennent les valeurs stockées par jQuery.les données de() en fait aller? Je peux l'inspecter/localiser/liste/déboguer à l'aide d'un outil?

40voto

Matt Points 21690

Regardez la source pour cela.

D'un coup d'œil, on dirait qu'il stocke les données dans cette variable cache créée à la ligne 2.

Modifier:

Voici une démonstration rapide qui trouve les données dans le cache: http://jsfiddle.net/CnET9/

Vous pouvez également transférer $.cache sur votre console et l'explorer manuellement.

7voto

Brett Weber Points 775

Vous semblez avoir obtenu la réponse à l'endroit où, mais ici, c'est un peu sur le comment. Il y a quelques règles que vous devez connaître avant d'utiliser ce.

L'AJOUT d'

L'ajout de variables à l'aide de l'objet retourné à partir de $('.sélecteur').de données() fonctionne parce que l'objet de données passe par référence, de sorte que n'importe où vous ajoutez une propriété, il est ajouté. Si vous appelez de données() sur un autre élément, c'est changé. C'est ce que c'est ce qu'il est...

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

L'ajout d'un objet endroits un objet à l'intérieur de l'objet de données, ainsi que "étend les données précédemment stockées avec cet élément." - http://api.jquery.com/data/#entry-longdesc

Cela signifie que l'ajout d'un obj de dataObj devient

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

L'ajout d'un tableau n'est pas d'étendre les données précédemment stockées, mais ne se comportent pas de la même chose qu'une simple valeur, soit...

À l'AIDE de

Si vous avez de simples valeurs stockées, vous pouvez les placer dans des variables et de faire ce que vous voulez avec eux, sans modification de l'objet de données.

cependant

si vous utilisez un objet ou un tableau pour stocker les données sur un élément, méfiez-vous!

Juste parce que vous le stocker dans une variable ne signifie pas que vous ne modifiez pas les données de la valeur. Juste parce que vous passez à une fonction ne signifie pas que vous ne modifiez pas les valeurs de données!

C'est ce que c'est ce qu'il est.. sauf si c'est simple.. alors c'est juste une copie. :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!

Ainsi, les ressources..

Quelle est la meilleure façon de stocker plusieurs valeurs pour jQuery $.de données()? http://stackoverflow.com/a/5759883/1257652

4voto

Nick Craver Points 313913

Vous pouvez l'inspecter en appelant simplement .data() sans paramètre, comme ceci:

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

Quant au "où", il est stocké dans un objet cache global jQuery sous une clé représentant votre élément. L'appel de .data() renvoie réellement jQuery.data(yourDomElement) , ou vous pouvez vous en tenir à une clé si vous appelez une valeur spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X