Для записи, это не работает:
(function ($) {
"use strict";
var methods = {
init: function () {
return this.each(function () {
$(this).click(function () {
$(this).myPlugin("close", function () {
$(this).myPlugin("open");
});
});
});
},
open: function () {
return this.each(function () {
console.log("open was called");
$(this).children(":hidden").slideDown("slow");
});
},
close: function (callback) {
return this.each(function () {
console.log("close was called");
$(this).children(":visible").slideUp("slow");
callback.call($(window));
});
}
};
}(jQuery));
Приведенный выше код проясняет, что выполнение сценария не ожидает завершения метода close перед вызовом метода open в случае анимации слайдов jQuery. Вот решение, на котором я в итоге остановился, используя метод обещания jQuery:
(function ($) {
"use strict";
var methods = {
init: function () {
return this.each(function () {
$(this).click(function () {
$(this).myPlugin("toggle");
});
});
},
toggle: function () {
return this.each(function () {
var $openBox = $(this).children(":visible"),
$closedBox = $(this).children(":hidden");
$openBox.slideUp("fast").promise().done(function () {
$closedBox.slideDown("fast");
});
});
}
};
}(jQuery));