jQuery scheint mehrere Anrufe gleichzeitig ausgeführt werden,
-
30-09-2019 - |
Frage
Es tut uns Leid, aber anscheinend verstehe ich nicht genug, um herauszufinden, dieses Problem ...
Verkettungs Ich bin die Umsetzung einer jQuery-Karussell-Plugin (jCarouselLite) und ich versuche, eine Option ‚entfernen‘ eines der Karussell Artikel (derzeit <div class="remove">
) ...
initEvents: function() {
var self = this;
// Bind jQuery event for REMOVE button click
$('.remove').live('click', function() {
// Need to save the ID that we're removing
var item = $(this).closest('li.sort');
var itemId = item.attr("id");
$(this).removeItem();
self.refreshDisplay(itemId);
});
$.fn.removeItem = (function() {
var item = this.closest('li.sort'); // could save this call by passing param
item.fadeOut("normal", function() {
$(this).remove();
});
// preserve jQuery chain
return this;
});
},
refreshDisplay(itemId) {
// ...
// redraws carousel
// ...
// itemId is used to remove from the array of Items to show (class-wide scope)
}
Da gibt es keine saubere Art und Weise zu ‚Refresh‘ der jCarouselLite Plugin (vielleicht etwas, das ich versuche es später in der eigentlichen Plugin Implementierung) die schnelle und schmutzige Lösung für diese ist nur das Karussell zu regenerieren.
Das Problem ist, ich versuche das Element geklickt auszublenden, jedoch scheint es, wie der refreshDisplay () vor der Animation der Ausblendung genannt wird (und Entfernen) der klickten Punkt abgeschlossen ist. Ich habe dies bestätigt durch die self.refreshDisplay(itemId);
Linie zu kommentieren und sie ausblendet und entfernt wie erwartet.
Also ich denke, es gibt eine gewisse Art und Weise ich Kette brauchen diese? Ich habe ein paar Stunden des Lesens, wie Verkettungs Arbeiten gemacht und ich dachte, dass ich es verstanden, aber anscheinend nicht.
Jede und alle Hilfe ist willkommen, danke!
Lösung
Der Zweck der Verkettung ist, mehr Befehle zu ermöglichen, ein Basisobjekt zu teilen, aber es funktioniert nicht Ursache jeden Befehl für die vorherigen warten.
Dafür benötigen Sie einen Rückruf verwenden. So etwas wie
initEvents: function() {
var self = this;
// Bind jQuery event for REMOVE button click
$('.remove').live('click', function() {
// Need to save the ID that we're removing
var item = $(this).closest('li.sort');
var itemId = item.attr("id");
$(this).removeItem(function() {
self.refreshDisplay(itemId);
});
});
$.fn.removeItem = (function(callback) {
var item = this.closest('li.sort'); // could save this call by passing param
item.fadeOut("normal", function() {
$(this).remove();
callback(); //now your refresh is being called after the fade.
});
// preserve jQuery chain
return this;
});
},