2010-05-16 6 views
2

J'essayais le jQuery Data linking proposal from Microsoft et j'ai remarqué quelque chose d'étrange. Mes objets obtiennent cette propriété supplémentaire et je me demandais quelle est la raison pour cela. J'ai d'abord pensé que ce fut une erreur que je fait mais j'ai remarqué leur page de démonstration fait la même chosejQuery Datalink - Liaison de données

Ceci est le résultat JSON de mes objets:

[{ 
     "propertyName":"ProductNamese", 
     "controlType":"Text", 
     "jQuery1274021322131":6 
    }, 
    { 
     "propertyName":"Price", 
     "controlType":"Number", 
     "jQuery1274021322131":9 
    }, 
    { 
     "propertyName":"Description", 
     "controlType":"TextArea", 
     "jQuery1274021322131":12 
    } 
] 

La propriété dont je parle est « jQuery1274021322131 ».

+0

Comment ce résultat JSON est-il construit? Ensuite, il nous sera plus facile de vérifier le code source de ce plugin jQuery – Harmen

Répondre

4

Lorsque vous transtypez un objet DOM dans un objet jQuery (c'est-à-dire $("#SomeElementID")), jQuery ajoute une propriété "expando" spéciale à l'objet. Je crois que cette propriété est utilisée en interne par la bibliothèque pour aider à mettre en cache l'élément dans son tableau interne pour un accès plus rapide.

En fouillant dans la bibliothèque, c'est le code qui crée cette valeur et comment il est utilisé en interne:

var expando = "jQuery" + now(), uuid = 0, windowData = {}; 

    jQuery.extend({ 
     cache: {}, 

     data: function(elem, name, data) { 
      elem = elem == window ? 
       windowData : 
       elem; 

      var id = elem[ expando ]; 

      // Compute a unique ID for the element 
      if (!id) 
       id = elem[ expando ] = ++uuid; 

      // Only generate the data cache if we're 
      // trying to access or manipulate it 
      if (name && !jQuery.cache[ id ]) 
       jQuery.cache[ id ] = {}; 

      // Prevent overriding the named cache with undefined values 
      if (data !== undefined) 
       jQuery.cache[ id ][ name ] = data; 

      // Return the named cache data, or the ID for the element 
      return name ? 
       jQuery.cache[ id ][ name ] : 
       id; 
     }, 
// snipped 
1

jQuery utilise le expando pour associer un objet (élément dom, ou autre) avec son cache de données lors de l'utilisation de la méthode data() (elle n'est PAS provoquée simplement en exécutant $(), comme l'indique la réponse acceptée). Le plugin de liaison de données utilise data() sur l'objet, créant ainsi l'expando. Il est regrettable que l'expando soit si "régulier" - il devrait être plus facilement caché. Par exemple, il doit être encapsulé dans une fonction afin que les sérialiseurs JSON ne l'incluent pas. jQuery fonctionne avec des objets normaux, mais il y a des bords rugueux comme celui-ci. J'espère qu'ils pourront être aplanies à l'avenir.

+0

La raison pour laquelle il s'agit d'une chaîne simple est d'éviter d'attacher des fonctions aux éléments DOM. L'utilisation d'une chaîne simple comme clé dans le cache $ .data signifie que vous ne recevez pas de fuites de mémoire dans IE. –

+0

Attacher une fonction à un élément DOM n'est pas une fuite, mais seulement une fuite si cette fonction référence l'élément (directement ou via la référence de fermeture) car cela provoque une rupture circulaire entre les objets DOM et JS. Vous voulez également éviter de mettre les données directement sur l'élément, car qui sait ce que les données contiennent, cela peut aussi provoquer une référence circulaire. Ce que j'ai proposé était une fonction vide qui contient le expando (la 'chaîne'), ou même, a l'expando comme un champ (sur la fonction). C'est sur. Juste un truc pour le cacher des sérialiseurs JSON. – InfinitiesLoop