2011-09-13 3 views
3

J'ai une rangée cliquable, qui déclenchera un lien onclick événement, mais trigger() provoquera un nouvel événement de clic sur tr.clickable et passera en boucle. Comment éviter cela?jQuery trigger ('click') problème

<table> 
    <tr class="clickable"> 
     <td>Test row</td> 
     <td><a href="#" onclick="alert('click');" class="trigger"></a></td>   
    </tr> 
</table> 

js:

$('tr.clickable').click(function(){ 
    var trigger = $(this).find('a.trigger'); 
    trigger.trigger('click'); 
}); 

démo en direct here.

+0

Pourquoi essayez-vous de faire ce que vous faites? @simoncereska a la bonne réponse, mais le raisonnement pourrait être faux selon ce que vous essayez réellement de faire. Vous l'avez spécifiquement dit de se mettre dans une boucle .... –

+0

J'ai besoin de quelque chose comme ça: l'utilisateur clique sur une ligne, la fonction onclick pour l'intérieur '' est appelée ** seulement une fois ** et fait. – marioosh

+0

Dans ce cas, @Matt a la bonne approche. –

Répondre

6

Ce chiffre est inférieur à l'événement bouillonnant en JavaScript. Il est un peu d'une configuration bizarre que vous avez à l'heure actuelle, mais une façon de le fixer serait d'arrêter l'événement click bouillonnant sur l'étiquette a:

$('tr.clickable a').click(function (e) { 
    e.stopPropagation(); 
}); 

Fiddle

Alternativement vous ne pouviez pas feu le déclencheur click si l'événement cible est le même élément:

$('tr.clickable').click(function(e){ 
    var trigger = $(this).find('a.trigger').not(e.target); 
    trigger.trigger('click'); 
}); 

Fiddle

Le meilleur moyen serait probablement la première solution, je suppose.

+0

Je voudrais remplacer l'onclick par $ ('td .trigger'). Click (fonction (e) {e.stopPropagation(); alerte ('Cliquez sur'); }); C'est une bonne pratique de ne pas utiliser javascript en ligne. – Luigi

+0

merci beaucoup pour l'explication et la solution de travail! – marioosh

2

supprimer trigger.trigger('click'); et thats it :)

+0

ne fonctionne pas: 'http: // jsfiddle.net/fg6za/12 /' – marioosh

0

Essayez ce script

$('tr.clickable').click(function(){ 
     alert('Click'); 
}); 

en direct demo

0

Je suggère d'utiliser le paramètre d'événement, de vérifier ce qui est la cible du clic.

$('tr.clickable').click(function(e){ 
    if (e.target.nodeName != 'A') { 
    var trigger = jQuery(this).find('a.trigger'); 
    trigger.trigger('click'); 
    } 
});