2010-01-05 5 views
4

J'ai ajouté de nouveaux éléments via jQuery dans certains de mes projets, et je suis tombé sur un problème encombrant.Réenregistrer des événements avec jQuery

Considérez ce qui suit:

$('span.claim').click(function() { 
    $(this).parent().html('<span class="unclaim">Unclaim</span>'): 
}); 

$('span.unclaim').click(function() { 
    $(this).parent().html('<span class="claim">Claim</span>'): 
}); 

Et le balisage suivant ...

<ul> 
    <li><span class="claim">Claim</span></li> 
    <li><span class="unclaim">Unclaim</span></li> 
    <li><span class="claim">Claim</span></li> 
    <li><span class="unclaim">Unclaim</span></li> 
</ul> 

Malheureusement, après l'événement initial est tiré, aucun événement sont traités.

Je réalise que je pourrais complètement restructurer et utiliser la fonction .bind(), mais en raison de la complexité de mon projet, ce n'est pas vraiment possible.

Comment est-ce que j'irais relâcher les événements après que les nouveaux éléments aient été créés sans abandonner mes fonctions anonymes, ou est-ce même possible?

+0

Une raison pour créer de nouveaux éléments HTML au lieu de changer le texte et les noms de classe sur clic? – David

+0

Il se passe beaucoup plus que simplement créer les éléments. C'était juste destiné à être un simple exemple de ce qui se passe, pas un littéral. – Skudd

Répondre

6

Vous voulez probablement regarder des événements en direct jQuery: http://docs.jquery.com/Events/live

+0

+1 - Je ne connaissais pas le live, c'est très, très pratique. – sberry

+0

C'est exactement ce dont j'avais besoin. Merci! – Skudd

+2

La méthode live() est déconseillée à partir de jquery1.7. http://api.jquery.com/live/ – Yeonho

1

Option 1:

$('a.claim').click(function() { 
    $(this).html('Unclaim').addClass('unclaim').removeClass('claim'); 
}); 

$('a.unclaim').click(function() { 
    $(this).html('Claim').addClass('claim').removeClass('unclaim'); 
}); 

Option 2:

function bindClaim(){ 
$('a.claim').unbind('click').click(function() { 
    $(this).parent().html('<span class="unclaim">Unclaim</span>'); 
    bindUnclaim(); 
}); 
} 

function bindUnclaim(){ 
$('a.unclaim').unbind('click').click(function() { 
    $(this).parent().html('<span class="claim">Claim</span>'); 
    bindClaim(); 
}); 
} 

bindClaim(); 
bindUnclaim(); 

Option 3 (recommandé):

http://docs.jquery.com/Events/live au lieu de lier.

+0

+1 pour donner plusieurs options. – sberry

1

Pas besoin de .live() ou de relier celui-ci. Vous avez seulement besoin d'une méthode:

$('.claim,.unclaim').click(function() { 
    var claimed = $(this).hasClass('claim') ? 'Unclaim' : 'Claim'; 
    $(this).text(claimed).attr('class', claimed.toLowerCase()); 
}); 
+0

Ce n'est pas vraiment une solution viable en raison de la complexité des événements réels. L'exemple donné était seulement destiné à être un exemple simple; beaucoup plus se passe réellement dans chaque événement. – Skudd

+0

C'est toujours une bonne idée de garder l'événement simple et d'appliquer des méthodes en fonction de la cible (délégation d'événement) – David

Questions connexes