2011-01-13 2 views
0

Ich habe ein leichtes jquery-Plugin geschrieben, um Tab-Wechsel zu verwalten, es hat gut in Entwicklung und Tests funktioniert. Ich hatte eine seltsame Anforderung für eine der Registerkarten, um beim Öffnen die Höhe zu vergrößern und dann beim Schließen die Höhe zu verkleinern. Die Änderungen müssen eine Animation sein, das Öffnen erfolgt einfach über einen Rückruf, der ausgelöst wird, wenn die Tab-Umschaltung abgeschlossen ist.Wie kann ich die Ausführung eines Plugins von einem Rückruf verzögern?

Ich kann jedoch nicht erreichen, dass die schließende Animation funktioniert, dies liegt daran, dass das Plugin die Registerkarte fortsetzt und versteckt, bevor die Animation abgeschlossen ist.

Gibt es trotzdem ich kann das Plugin zwingen zu pausieren, bis eine Callback-Funktion abgeschlossen ist?

Der Code, den ich den Rückruf zu feuern bin mit ist

if($.isFunction(params.click)){ 
    params.click.apply(this,[content,tab,set]); 
}; 

Ich will nicht wirklich den Weg der Verwaltung von Animationen im Plugin

+0

Können Sie keinen Rückruf an den ursprünglichen Rückruf senden? – RobertPitt

+0

Ich hatte daran gedacht, aber meine Firma könnte beginnen, dieses Plugin an mehreren Orten zu verwenden, so wie es geschrieben wird die Mehrheit des Plugins wäre im Rückruf, ich bin mir nicht sicher, ob ich wirklich damit umgehen will, aber wenn Alles andere scheitert, es ist eine Möglichkeit. – SigInTheHead

Antwort

0

gehen Wenn Sie kennt Plugin die Registerkarte derzeit "geöffnet", dann erfolgt das Öffnen eines neuen Tabs gleichzeitig mit dem Schließen eines anderen Tabs.

Wenn Sie also eine Callback-Funktion aufrufen können, die vom Client-Code bereitgestellt wird, müssen Sie zum Öffnen eines neuen Tabs sicher einen "Closing" -Rückruf auf dem zuvor geöffneten Tab aufrufen?

+0

ja, aber in diesem Abschluss-Callback der Client-Code läuft eine Animation, wie das Plugin läuft blendet die derzeit offene Registerkarte, zusammen mit der laufenden Animation. Da die im Clientcode instantiierte Animation den normalen jquery.animate complete Callback nicht verwenden kann, um das Plugin daran zu hindern, das auszuführen, was ich im Wesentlichen tun möchte, führe ich den closing callback synchron aus, dh das Plugin pausiert bis zum Rückruf ist abgeschlossen – SigInTheHead

+0

Sie sollten nie eine tatsächliche Pause haben, aus Gründen der Benutzerfreundlichkeit wäre es eine schreckliche Idee; und um die ursprüngliche Frage zur Hälfte zu beantworten, gibt es keine API, um die Ausführung eines Plugins in jQuery anzuhalten. Ich würde empfehlen, dass Sie Callbacks 'tabClosing' und' tabOpening' haben, die beide gleichzeitig ausgelöst werden, wenn ein Benutzer eine neue Registerkarte auswählt. Ich werde mit der Antwort aktualisieren, wie Sie das verwenden können, um den Effekt zu erzeugen, nach dem Sie suchen. –

0

Erstellen Sie einen Rückruf für das Öffnen und Schließen von Registerkarten. Wenn ein Benutzer die Registerkarte ändert, wird das Ereignis tabOpening für die neue Registerkarte ausgelöst, und das tabClosing-Ereignis wird für die alte Registerkarte aufgerufen.

Spezifizieren Sie in Ihrer Dokumentation, welche zuerst auftreten wird, um die Verwendung Ihres Plugins einfach zu machen! Vorausgesetzt, dass tabClosing würde Feuer zuerst könnten Sie dann Client-Code wie folgt schreiben:

var $closingTab = null, 
    $openingTab = null; 

$('#target').yourPlugin({ 
    tabClosing: function(tab) { 
     $closingTab = $(tab); 
    }, 
    tabOpening: function(tab) { 
     $openingTab = $(tab); 
     // Animate the 
     $closingTab.animate({}, 1000, function() { 
      $openingTab.animate({}, 1000); 
     }); 
    } 
}); 

Oder einfach mehr, aber weniger primitiv könnten Sie einen tabChange Rückruf haben, die die gesamte Veranstaltung ecapsulate könnte:

$('#target').yourPlugin({ 
    tabChange: function(oldTab, newTab) { 
     $(oldTab).animate({}, 1000, function() { 
      $(newTab).animate({}, 1000); 
     }); 
    } 
}); 
+0

Zunächst einmal danke für die Antworten, als ich sagte, das Plugin war leicht, ich habe es wirklich gemeint. wenn ich das tue, wie Sie oben beschrieben haben, wird eine Menge des Plugins überflüssig sein. Ich fange an zu denken, dass dieser Code nur zur Hauptskriptdatei für die Site hinzugefügt werden muss. – SigInTheHead

Verwandte Themen