2010-08-04 13 views
12

vielleicht fehlt mir überhaupt etwas über die Handhabung in jQuery, aber hier ist mein Problem.jquery temporäre unverbindliche Ereignisse

Nehmen wir an, es gibt einige Ereignisbindung, wie

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

Nun würde Ich mag einen neuen mousemove-, dass die vorherige überschreibt nicht verbindlich einzuführen, aber es vorübergehend auszuschließen sind (unbind). Mit anderen Worten, wenn ich meine Funktion binde, muss ich sicher sein, dass keine anderen Funktionen für dieses Ereignis jemals ausgeführt werden, bis ich sie wiederherstelle.

Ich bin auf der Suche nach so etwas wie:

$(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); 

Natürlich ist die someFunc nicht unter meiner Kontrolle, oder dies wäre nutzlos :)

Ist mein Verständnis, dass möglich ist, mehrere zu binden Funktionen für dasselbe Ereignis und dass die Ausführung dieser Funktionen nicht im Voraus festgelegt werden kann. Ich bin mir bewusst, die Ereignisausbreitung und sofortige Ereignisausbreitung zu stoppen, aber ich denke, dass sie in meinem Fall nutzlos sind, da die Ausführungsreihenfolge nicht bestimmt werden kann (aber vielleicht bekomme ich diese falsch).

Wie kann ich das tun? Vielen Dank im Voraus ~ Aki

EDIT: Ich muss dies hervorheben: Ich brauche, dass der zuvor installierte Handler (somefunc) nicht ausgeführt wird. Ich definiere diesen Handler NICHT, er kann oder kann nicht vorhanden sein, aber er wird von einem Drittanbieter installiert.

EDIT2: Ok, das ist momentan nicht machbar, ich denke, ich brauche die eventListenerList, die in den meisten Browsern noch nicht implementiert ist. http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html

Antwort

7

könnte eine andere Art und Weise sein, benutzerdefinierte Ereignisse zu verwenden, etwas in diese Richtung:

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 
}); 

Sehr ärgerlich Demo hier: http://jsfiddle.net/SkFvW/

+0

Wow! Ich habe daran nicht gedacht :) Das kann total funktionieren! Vielen Dank! – AkiRoss

+0

Hoppla, tut mir leid, ich habe mich geirrt: diese Lösung funktioniert nicht, weil ich den vorherigen Mausbewegungs-Handler deaktivieren muss, der gebunden wurde. – AkiRoss

+0

@AkiRoss - Warum müssen Sie den vorherigen Handler deaktivieren? Indem Sie den Schalter umdrehen, erhalten Sie den gleichen Effekt. – JasCav

0

Gut, wenn das Ereignis an mehrere Elemente gebunden ist:

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

(Klasse 'Flagge' hinzufügen, um die Bindung zu trennen, fügen Sie sie zu 'bind')