Je sais que c'est mauvais pour stocker des données dans le DOM, mais pourquoi?

J'ai entendu maintes et maintes fois que c'est une mauvaise pratique de "utiliser le DOM comme une base de données."

Alors que j'ai en grande partie d'accord avec ce sentiment, cette question est plus sur le moins de noir et de blanc cas. En gardant à l'esprit les dernières révisions de jQuery .data() méthodes et le HTML5 attribut data-spec, est-il vraiment si mauvais pour coller des données dans les DOM pour l'amour de complaisance?

Par exemple, j'ai récemment mis en place un "live" de la fonction de calcul sur une table avec plein d'entrées en faisant quelque chose comme ceci:

<table>
  <tr>
    <td><input type="text"></td>
  </tr>
  <tr>
    <td><input type="text"></td>
  </tr>
</table>

jQuery:

$('table').bind('calculate',function(){
  var total = 0;
  $(this).find('tr').each(function(){
    total += $(this).data('value');
  });
  //display total
});

$('table input').bind('change keyup',function(){
  $(this).closest('tr').data('value',$(this).val());
  $(this).closest('table').trigger('calculate');
});

C'est un exemple simplifié parce que je pourrait ignorer les appels à .data() et aller directement à l'entrée de valeurs, mais imaginons un peu plus complexe scénario où des éléments autres que les entrées sont en affectant les valeurs de ligne.

Est-il de mal à utiliser le DOM pour stocker des données simples dans ce genre de situation?

  • Les nœuds dans votre arborescence DOM sont données.
  • touché. mais vous savez ce que je veux dire... les gens m'ont conseillé de toujours créer une sorte de modèle dans la mémoire ici. serait-ce de me sauver la forme de la difficulté ou est-ce vraiment ok?
  • Je suis en train de l'incompréhension de la question ou je suis malentendu comment jQuery de données() la méthode fonctionne. Je pensais que jQuery stockées ces valeurs dans son cache plutôt que littéralement fixation de données pour les DOM.
  • non plus! Je ne savais pas que jQuery données() la méthode des valeurs stockées dans un cache. J'ai été confondu par ce: As of jQuery 1.4.3 HTML 5 data- attributes will be automatically pulled in to jQuery's data object. The treatment of attributes with embedded dashes was changed in jQuery 1.6 to conform to the W3C HTML5 specification. je venais juste de supposer que puisque attributs data-et .de données() semblait être couplé que jQuery a été en utilisant les DOM. Mais clairement il y a une autre magie qui se passe. Je dois juste vérifier à la source...
  • jQuery créances ne pas le stocker dans les DOM: "Les attributs data - sont tirés dans le premier moment, les données de la propriété est accessible et puis ne sont plus accessibles ou muté (toutes les valeurs de données sont ensuite enregistrées dans la mémoire interne en jQuery)."