2009-10-12 12 views
1

J'utilise ce plugin: http://www.fyneworks.com/jquery/star-rating/Comment mettre une fonction de clic dans une fonction de rappel?

Est-il possible de placer une fonction de clic dans une fonction de rappel comme celle-ci?

$('.auto-submit-star').rating({ 
    callback: function(value, link){ 
    $('.myclass').click(function(){ 
     alert($(this).attr('id')); 
    }); 
    alert($(this).attr('id')); 
    } 
}); 

La fonction de rappel cessera de fonctionner une fois que j'aurai ajouté la fonction de clic. Je dois le faire parce que si l'utilisateur clique sur des étoiles, je peux ramasser l'id de l'étoile, mais si l'utilisateur clique sur le bouton d'annulation, je ne peux pas ramasser l'ID de l'annuler en quelque sorte.

En supposant que vous puissiez utiliser une fonction de clic dans le rappel, le déclencherait-il quand même? Parce qu'après avoir cliqué dessus, il déclenche le rappel, est-ce qu'il déclencherait toujours ma fonction de clic à l'intérieur?

Si je garde la fonction de clic, des choses séparées fonctionneront toujours, mais alors je devrais répéter un tas de code dans les deux fonctions.

+0

La réponse courte est oui c'est possible. Les deux solutions ci-dessous utilisant le gestionnaire d'événements "live" sont des solutions plus appropriées pour jQuery 1.3.x + –

Répondre

2

Pour éviter que plusieurs actions d'avoir lieu en cliquant, vous devez détruire l'événement précédent avant d'ajouter un nouveau (sinon ils vont simplement empiler les uns sur les autres). Afin de détruire (c.-à-tuer) un événement, vous devez:

$('.auto-submit-star').rating({ 
    callback: function(value, link){ 
    $(".myclass").die("click").live("click", function(){ 
     alert($(this).attr('id')); 
    }); 
    } 
}); 

Sinon (et de préférence), ne pas attacher l'événement de clic à partir de la fonction de rappel ... le faire séparément.

$(".myclass").live("click", function(){ 
    alert($(this).attr('id')); 
}); 
$('.auto-submit-star').rating() 

Bonne chance pour votre projet.

+0

Merci, c'est très utile. La raison pour laquelle je place le clic à l'intérieur de la fonction de rappel est après que j'obtiens l'identifiant que je vais répéter le même code dans chaque fonction, donc j'essayais de réduire le code répété. – Roger

+0

Hmm, en fait ce qui est bizarre, c'est que le code qui est placé en dehors de la fonction de clic direct est traité avant le code dans la fonction de clic direct. Pourquoi donc? – Roger

+0

@Roger: Je pense que vous êtes confus à ce que fait la méthode 'live()'. Fondamentalement ce que les trois premières lignes du deuxième exemple de code que j'ai donné est (1) trouve tous les éléments avec la classe 'myclass' et fait en sorte que chaque fois qu'un de ces éléments est cliqué, une boîte d'alerte apparaît avec l'ID du élément cliqué. Il répète ensuite le même processus chaque fois qu'un autre élément avec la classe 'myclass' est ajouté au DOM. Donc, en tant qu'utilisateur, vous ne saurez pas que la méthode 'live()' a été traitée jusqu'à ce que vous cliquiez sur un élément correspondant. Est-ce que cela a aidé? – KyleFarris

2

Essayez d'utiliser le gestionnaire en direct

$(".myclass").live("click", function(){ 
    alert($(this).attr('id')); 
}); 
+0

Cool, cela fonctionne. Cependant, parfois, je reçois plusieurs alertes pour une raison quelconque après avoir évalué les choses, même si c'était seulement un clic. Une idée de pourquoi cela arriverait? – Roger