Ajouter <li> élément <ul> et d'ajouter cliquez sur l'événement pour chaque?
Je voudrais ajouter une série de <li>
des éléments à un <ul>
, et cliquez sur ajouter un événement à chacun, par programme.
Je ne suis pas sûr de la façon de le faire, du moins pas dans un cadre soigné, jQueryish façon.
C'est mon code existant:
<ul id="saved-list"></ul>
<script type="text/javascript">
$.each(all_objects, function() {{
var list_route = "<li><a href='#saved-route'>" + this.text + "</a></li>";
$('#saved-list').append(list_route);
//add unique id (this.id) to item and click event here?
//pseudocode - onclick: alert(this.id);
});
$('#saved-list').refresh('listview'); //jquery mobile list refresh
</script>
Svp quelqu'un pourrait-il conseiller sur la façon d'ajouter un événement click pour chaque élément de la liste par programmation?
Mise à JOUR: j'ai besoin de faire quelque chose de légèrement différent pour chaque élément de la liste (disons une alerte) - toutes mes excuses pour ne pas faire de ce clair.
- Il vous manque un devis sur votre ul id de l'attribut, et pas de bloc de script autour de votre script. Mauvais copier/coller?
- merci, édité!
Vous devez vous connecter pour publier un commentaire.
Vous êtes mieux d'utiliser
.live()
ou.délégué()
que de s'inquiéter de la création d'un.click()
gestionnaire sur chaque élément que vous créez. Quelque chose comme ceci:Vous n'avez qu'à lier, cliquez sur le port d'écoute une fois, et il va travailler pour tous les
<li>
qui est un descendant de l'élément avec l'IDsaved-list
.Si vous ne souhaitez créer un gestionnaire d'événements click pour chaque
<li>
(je ne le recommande pas, tout de même), voici une belle façon de le faire:.live()
ou.delegate()
. La fonction de gestionnaire de clic peuvent se comporter différemment en fonction de l'élément qui a été cliqué..live()
ou.delegate()
sur.bind()
(ou ses équivalents) pour essayer de garder le nombre des écouteurs d'événement à un minimum. De nombreux événements avec les auditeurs peuvent commencer à s'enlise en bas de la page, en particulier dans les navigateurs plus anciens. Voir stackoverflow.com/questions/2629803 et stackoverflow.com/questions/4782399.live()
ou.delegate()
sur un ancêtre commun, vous n'avez pas à vous inquiéter au sujet de re-liaison auditeurs à des éléments qui sont ajoutés. C'est une autre grande victoire, et de définitivement s'applique dans votre cas.Ne pas.
Plutôt que de la liaison d'un nouveau gestionnaire d'événement pour chaque élément (qui pourrait devenir assez cher), se lier à un seul gestionnaire d'événements pour
#saved-list
, qui est un ancêtre commun. Remontée d'événements signifie que ancêtre éléments sont informés des événements sur leurs descendants, de sorte que vous pouvez gérer les événements de là, au lieu de sur l'origine de l'élément.Quelque chose comme ça...
Voir
déléguer
@Matt Balle est assez proche de la réponse ici, mais je vais ajouter un peu plus clairement que vous pouvez faire différentes choses avec le délégué, selon ce que l'élément a été cliqué:
$('#sauvé-list').refresh('listview'); //jquery mobile le rafraîchissement de la liste
Noter que le délégué
this
est toujours en se référant à lali
qui a été cliqué.N'est-il pas suffisant pour ajouter cet (ou après) votre boucle de courant?
$('#saved-list li').click(function(){ alert('hello'); });
Vous pouvez utiliser le
live
fonction, la chute est que vous pourriez avoir besoin d'un mécanisme pour déterminer exactement quelsli
les éléments qui ont été cliqué:bonjour phil en jquery vous pouvez créer des dom objet sans ajouter en tant que texte pour les dom.
cela vous donnera une chans de les manipuler avant qu'ils soient ajoutés (et après).
href
attribut sur le<li>
et n'avez pas créé de<a>
à tous.La
.click
fonction de lier une fonction de gestionnaire de clic à n'importe quel élément. Comme les commentaires dans votre code de mentionner que vous pouvez utiliser l'ID ou d'autres moyens pour sélectionner l'élément, après qu'il a été dans les DOM-isée, mais une autre façon de le faire c'est tout simplement pour faire référence à la variable qui contient l'élément que vous voulez lier.Exemple:
C'est sans doute un peu de style, mais une des caractéristiques de jQuery, c'est qu'il est chainable. Cela signifie que les appels de fonction jQuery toujours renvoyer une référence à l'ensemble de fractionnement de jQuery lui-même. À l'aide de la chainable, vous pouvez ré-écrire le code ci-dessus comme suit:
Bien que je ne sais pas ce que cela
$('#saved-list').refresh('listview')
entreprise, les éléments suivants pourraient être ce que vous cherchez:Noter que nous évitez d'ajouter les DOM jusqu'à la dernière minute, parce que l'ajout est cher.
Que d'autres affiches de la mention, à l'aide d'un délégué cliquez sur gestionnaire est une meilleure approche, en général. Qui ressemblerait à quelque chose comme
C'est pourquoi
bind
existe.Aussi, de cette façon est très facile de créer des clics pour chaque élément:
.bind('click', ...)
est la même chose que.click(...)
..click()
est plus concis.