2008-12-12 11 views
5

Dans une vie antérieure, je aurais pu faire quelque chose comme ceci:données associant à un élément DOM jQuery

<a href="#" onclick="f(311);return false;">Click</a><br/> 
<a href="#" onclick="f(412);return false;">Click</a><br/> 
<a href="#" onclick="f(583);return false;">Click</a><br/> 
<a href="#" onclick="f(624);return false;">Click</a><br/> 

Maintenant, avec jQuery, je pourrais faire quelque chose comme ceci:

<a class="clicker" alt="311">Click</a><br/> 
<a class="clicker" alt="412">Click</a><br/> 
<a class="clicker" alt="583">Click</a><br/> 
<a class="clicker" alt="624">Click</a><br/> 

<script language="javascript" type="text/javascript"> 
    $(".clicker").bind("click", function(e) { 
     e.preventDefault(); 
     f($(this).attr("alt")); 
    }); 
</script> 

Sauf que l'utilisation de l'attribut alt pour transmettre les données du DOM à jQuery ressemble à un hack, puisque ce n'est pas son but. Quelle est la meilleure pratique ici pour stocker/cacher des données dans le DOM pour que jQuery puisse y accéder?

Répondre

3

JQuery.data permet d'associer un dictionnaire à un élément DOM. Ces données peuvent être réglée via jQuery:

<a class="clicker">Click</a><br/> 
<a class="clicker">Click</a><br/> 
<a class="clicker">Click</a><br/> 
<a class="clicker">Click</a><br/> 

<script language="javascript" type="text/javascript"> 
    var values = new Array("311", "412", "583", "624"); 
    $(".clicker").each(function(i, e) { 
     $(this).data('value', values[i]).click(function(e) { 
     f($(this).data('value')); 
     }); 
    }); 
</script> 

ou (depuis jQuery 1.4.3) en utilisant le HTML5 data- attributes, qui fonctionne même dans les documents non-HTML5:

<a class="clicker" data-value="311">Click</a><br/> 
<a class="clicker" data-value="412">Click</a><br/> 
<a class="clicker" data-value="583">Click</a><br/> 
<a class="clicker" data-value="624">Click</a><br/> 

<script language="javascript" type="text/javascript"> 
    $(".clicker").click(function(e) { 
     f($(this).data('value')); 
    }); 
</script> 
+0

Cela me semble fragile. Vous dépendez d'une cohérence arbitraire dans l'ordre entre deux collections différentes - une donnée, un balisage. Je ne peux pas voir l'utiliser dans ce cas. – tvanfosson

+0

D'accord. Si je vais continuer dans cette voie, le plugin de métadonnées me semble être la solution. – Soldarnal

+0

Vous supposez commander des matières dans cet exemple? Tous les liens sont les mêmes! * Comment * vous définissez les données ne sont pas vraiment pertinentes à la question, OMI. –

4

Vous pouvez utiliser un attribut id comme "clicker-123" puis analyser le nombre. Je le fais habituellement ou utilise l'attribut 'rel'. Donc, pour l'essentiel, il n'y a pas de meilleure façon de le faire que je connaisse. J'espère que ce fil me prouve mal.

+0

Par souci de simplicité, et dans le cas de documents non HTML5, c'est en effet la meilleure réponse que celle sélectionnée. J'ai mon vote! – designermonkey

1

Je suis désolé, mais si vous êtes déjà en train de remplir la balise alt, je ne vois pas comment retarder l'affectation du gestionnaire onclick à jQuery vous achète quoi que ce soit. N'est-ce pas juste un cas de "Maintenant que j'ai un marteau, chaque problème ressemble à un clou." Je pense que la méthode jquery est mieux utilisée lorsque l'action ne dépend pas de données supplémentaires que ce qui peut naturellement être dérivé du contenu, par exemple, définition de classe, type de balise, etc

+0

Dans ce cas, mon clicker ouvre une boîte de dialogue modale de l'interface utilisateur. Quand l'affectation onclick est-elle exécutée? Si avant jQuery est prêt, onclick pourrait s'exécuter avant que la boîte de dialogue ne soit prête; si après, alors je ne le retarde pas du tout. – Soldarnal

4

Vous utiliserez au mieux une nouvelle fonctionnalité de HTML5: l'attribut data-....

Votre code HTML ressemblera à ceci:

<a class="clicker" data-mynumber="311">Click</a> 

Ensuite, vous pouvez utiliser el.attr('data-mynumber') pour obtenir les données.

Au lieu de mynumber, vous pouvez choisir n'importe quel nom.

Cela fonctionne dans tous les navigateurs.

+2

Theres un assistant jQuery agréable pour accéder aux attributs de données HTML5: $ (el) .data ('mynumber'); – Gazza