2010-07-13 4 views
0

dans notre projet actuellement j'ai le problème suivant. Je dois lier quelques clics à une liste d'éléments de verrouillage comme les éléments suivants:Javascript bonne pratique - onclick vs discret

 
    <ul> 
    <li class="listeelement" id="load-content-id-1"><div>listcontent</div></li> 
    <li class="listeelement" id="load-content-id-2"><div>listcontent</div></li> 
    <li class="listeelement" id="load-content-id-3"><div>listcontent</div></li> 
    <li class="listeelement" id="load-content-id-4"><div>listcontent</div></li> 
    </ul> 

Le clic sur .listelement doit envoyer une demande à une action spécifique avec params spécifiques comme l'ID d'élément et quelque chose comme ça (-> module/action? id = 1 & quelque chose = quelque chose).

Je veux écrire une classe de requête générique qui envoie la requête et gère toutes les choses, qui ont à faire avec le clic et la requête et je ne suis pas sûr si c'est un bon moyen de lier le clic nonobstrusif à la classe .listelement et enregistrer l'action et les informations de param dans un balisage OU s'il est préférable de lier le clic par l'onclick = "sendRequest (action, params)". La solution obstrusive-onclick me semble beaucoup plus facile, mais je ne suis pas sûr que ce soit aussi une bonne solution.

Serait heureux si quelqu'un pouvait donner une opinion à ce sujet. Merci.

Répondre

1

Je suggère d'utiliser un balisage décent et ne pas compter sur onclick attributs. La plus grande raison serait que cela garde votre balisage propre, et cela réduit également la taille des octets sur le fil si vous avez beaucoup de ces éléments.

En outre, je ne coderais pas les valeurs dans l'attribut id, car vous pouvez désormais utiliser légalement les attributs de données HTML5 et ils sont également rétrocompatibles.

<ul id="container"> 
    <li class=".." data-action="login" data-id="1" data-params="a=b">..</li> 
    <li class=".." data-action="logout" data-id="2" data-params="c=d">..</li> 
    ... 
</ul> 

Une fois que vous avez les données dans le balisage, il est assez simple à configurer les gestionnaires de clic et connectez-vous avec la classe Request.

var list = document.getElementById("container"); 
var items = list.getElementsByTagName("li"); 

for(var i = 0; i < items.length; i++) { 
    items[i].onclick = (function(element) { 
     return function() { 
      var action = element.getAttribute('data-action'); 
      var id = element.getAttribute('data-id'); 
      var params = element.getAttribute('data-params'); 

      sendRequest(action, params); 
     }; 
    })(items[i]); 
} 

Si vous avez un beaucoup de <li> éléments, puis la délégation d'événement peut être une meilleure approche au lieu d'ajouter un gestionnaire pour chaque élément. En outre, envisagez d'utiliser le modèle d'enregistrement d'événement DOM pour ajouter des gestionnaires à la place de la propriété onclick car cela limite les options à un seul gestionnaire.

+0

J'adore cette solution HTML5. Mais actuellement nous utilisons xhtml, car nous devons supporter tous les navigateurs comme ie7, etc. J'ai donc besoin d'une solution que je peux utiliser à la manière de la «vieille école» :). – snirgel

+0

Je pense que vous pouvez toujours utiliser les attributs de données, j'espère :) Voir http://stackoverflow.com/questions/2412947/do-html5-custom-data-attributes-work-in-ie-6 et http: // wiki .whatwg.org/wiki/HTML_vs._XHTML # Syntax_and_Parsing – Anurag

+0

Merci beaucoup.J'ai discuté avec mon CTO et nous sommes d'accord, que ce serait une bonne solution, mais est-ce possible que l'élément element.dataset ne fonctionne pas actuellement, par exemple. Firefox (essayé avec la version 3.6.3 sur Ubuntu). À ce stade, votre solution d'analyse syntaxique des attributs de données semble un peu statique pour nos besoins, car vous devez généralement savoir quels attributs de données sont définis dans la balise, car vous ne pouvez pas obtenir l'ensemble de données. Btw.: Avez-vous essayé/essayé ceci: http://www.orangesoda.net/jquery.dataset.html? Sons, comme cela réglerait-il mes problèmes ?! – snirgel

0

Voici une option. Faites à la place les liens du li <a> et placez le contrôleur/action comme une chaîne de requête (ou des paires clé-valeur délimitées par des barres obliques si votre back-end peut analyser de jolies URL). En supposant que vous faites un appel AJAX, ayez un javascript simple qui, au chargement de la page, accroche l'événement click pour tous les éléments <a> avec une classe donnée (vous pouvez choisir quelque chose de approprié, comme .ajax-link). Dans le gestionnaire, empêchez l'action par défaut de sorte que le navigateur ne navigue pas vers le href, et cueillez le href, l'analyser, et configurer un xhr avec lui et vous partez. Je ne sais pas si vous utilisez une bibliothèque comme jQuery, mais cela allégerait la charge et le code.

Si vous le souhaitez, vous pouvez imbriquer le <a> dans le <li> existant.

Cela pourrait aider: JQuery parameter injection on bind/click vs. embedded click handlers with parameters