Как мне написать метод плагина jQuery, который принимает функцию обратного вызова? - PullRequest
0 голосов
/ 28 марта 2012

Я прочитал пару похожих случаев по переполнению стека, но еще не совсем так, как у меня. Вот суть моего плагина jQuery:

(function($) {
    var methods = {
        init: function() {
            ...
            $(this).myPlugin("close");
            $(this).myPlugin("open");
        },
        open: function() {
            ...
        },
        close: function() {
            ...
        }
    }
})(jQuery);

Методы open () и close () включают методы jQuery slideUp () и slideDown (), поэтому мне нужно иметь возможность вызывать метод close (), а затем вызывать метод open () в качестве обратного вызова. Однако, когда я пытаюсь это решение , мне не везет.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012
(function($) {
var methods = {
    init: function() {
        ...
        $(this).myPlugin("close",function() {
            $(this).myPlugin("open");
        }
    },
    open: function() {
        ...
    },
    close: function(options, callback) {

        callback.call($(window));
        ...
    }
}
})(jQuery);

Вы можете использовать этот код .. Это способ вызова функции (обратного вызова), передаваемой в качестве аргумента.

0 голосов
/ 22 июня 2012

Для записи, это не работает:

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