C'est ennuyeux, mais la seule solution est de supprimer l'événement au démarrage du drag et de le remettre à l'arrêt du drag. Essayez ceci :
$(".foo").click(function(){
alert("blah");
});
$(".bar").draggable({
stop: function(event) { setTimeout(function() {
$(".foo").click(function(){
alert("blah");
}); }, 100)},
start: function(event) { $('.foo').unbind('click'); }
});
Maintenant, il y a toujours le problème que vos événements de clic sont probablement un peu plus compliqués que cela, et vous ne voulez probablement pas avoir à les réécrire. Vous pouvez enregistrer les événements pour plus tard en utilisant les données jquery comme ceci :
var events = $('#test').data("events") ;
Vous pouvez également utiliser la fonction jquery live pour attacher l'événement de clic afin que l'événement ne soit jamais lié qu'à un élément qui correspond à ce sélecteur. Cela signifie que si vous modifiez la classe de l'élément pendant qu'il glisse, de sorte qu'il ne corresponde plus à ce sélecteur, il n'aura plus cet événement de clic. Quelque chose comme ceci pourrait fonctionner :
$(".bar .foo").live('click', function(){
alert("blah");
});
$(".bar").draggable({
stop: function(event) { setTimeout(function() {
$(".draggableBar").removeClass('draggableBar').addClass('bar');
}, 100)},
start: function(event) { $(this).removeClass('bar').addClass('draggableBar'); }
});
Il faudrait aussi mettre à jour les css pour que draggablebar ait le même style que bar.