2010-08-04 5 views
12

peut-être que je manque totalement quelque chose à propos de la gestion même dans jQuery, mais voici mon problème.jquery événements de désengagement temporaires

Supposons il y a un événement de liaison, comme

$(element).bind("mousemove", somefunc); 

Maintenant, je voudrais vous présenter une nouvelle mousemove de liaison qui ne remplace pas le précédent, mais exclure temporairement (unbind) il. En d'autres termes, quand je lie ma fonction, je dois être sûr qu'aucune autre fonction ne sera exécutée pour cet événement, jusqu'à ce que je les restaure.

Je cherche quelque chose comme:

$(element).bind("mousemove", somefunc); 
// Somefunc is used regularly 
var savedBinding = $(element).getCurrentBinding("mousemove"); 
$(element).unbind("mousemove").bind("mousemove", myfunc); 
// Use myfunc instead 
$(element).unbind("mousemove", myfunc).bind("mousemove", savedBindings); 

Bien sûr, le somefunc n'est pas sous mon contrôle, ou ce serait inutile :)

Je crois comprendre qu'il est possible de lier plusieurs fonctions au même événement, et que l'exécution de ces fonctions ne peut pas être prédéterminée. Je suis conscient de la propagation d'événements d'arrêt et de la propagation immédiate d'événements, mais je pense qu'ils sont inutiles dans mon cas, car l'ordre d'exécution ne peut pas être déterminé (mais peut-être que je me trompe).

Comment puis-je faire cela? Merci d'avance ~ Aki

EDIT: Je dois souligner ceci: J'ai besoin que le gestionnaire précédemment installé (somefunc) ne soit pas exécuté. Je ne définis pas ce gestionnaire, il peut être ou peut ne pas être présent, mais il est installé par un utilisateur tiers.

EDIT2: Ok, ce n'est pas faisable pour l'instant, je pense que j'ai besoin de la eventListenerList, qui n'est pas encore implémentée dans la plupart des navigateurs. http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html

Répondre

7

Une autre façon pourrait être d'utiliser des événements personnalisés, quelque chose le long de ces lignes:

var flag = 0; 
$(element).bind("mousemove", function() { 
    if(flag) { 
     $(this).trigger("supermousemove"); 
    } else { 
     $(this).trigger("magicmousemove"); 
    } 
}).bind("supermousemove", function() { 
    // do something super 
}).bind("magicmousemove", function() { 
    // do something magical 
}); 

$("#foo").click(function() { 
    flag = flag == 1 ? 0 : 1; // simple switch 
}); 

démo très ennuyeux ici: http://jsfiddle.net/SkFvW/

+0

Wow! Je ne pense pas à cela :) Cela peut fonctionner totalement! Merci! – AkiRoss

+0

Oups, désolé, j'avais tort: ​​cette solution ne fonctionne pas, car j'ai besoin de désactiver le précédent gestionnaire de mousemove qui a été lié. – AkiRoss

+0

@AkiRoss - Pourquoi avez-vous besoin de désactiver le gestionnaire précédent? En basculant l'interrupteur, vous obtenez le même effet. – JasCav

0

Bon si l'événement est lié à plusieurs éléments:

$('.foo').click(function() { 
    if (! $(this).hasClass('flag')) { 
     do something 
    } 
}); 

(ajouter la classe 'flag' pour trier, l'ajouter à 'bind')