jQuery: изменить параметр плагина после вызова - PullRequest
4 голосов
/ 25 апреля 2011

У меня есть собственный плагин для настройки нескольких вещей при использовании диалога jquery-ui. Вместо звонка:

$("#popup").dialog(options);

Я использую это:

$("#popup").dialogPlugin(options);

И dialogPlugin будет вызывать .dialog(options) (после выполнения некоторых действий).

В моем плагине я могу изменить некоторые функции для событий диалога следующим образом:

var originalCloseFn = options.close;
options.close = function() {
    //my own stuff.
    originalCloseFn();
};

Плагин отлично работает, но через некоторое время, используя его, я понял, что не могу изменить функции диалога извне плагина следующим образом:

$("#popup").dialog("option", "close", newFunctionOnClose);

Если я сделаю это, код, добавленный плагином к функции закрытия, будет потерян.

Итак, я добавил этот код в начале моего плагина:

if (options == "option") {
    if (val == undefined)
        return _this.dialog("option", name);
    else
        return _this.dialog("option", name, val);
}

Теперь мне нужно изменить пятую строку этого кода, чтобы фактически изменить параметры моего плагина, а не jquery-ui. (Опция функции .dialogPlugin, а не .dialog). Я действительно не знаю, как я могу это сделать. Есть идеи, пожалуйста?

Редактировать

Я знаю, что вопрос не очень ясен, и мой плохой английский не позволяет мне больше объясняться, поэтому я сделал пример .

Я хочу, чтобы в седьмой строке (return $(this).dialog("option", name, val);) вместо модификации (эквивалентной optionsForJQuery.close) изменилось options.close. Таким образом, я не буду кодировать поведение плагинов.

1 Ответ

2 голосов
/ 25 апреля 2011

попробуйте это:

HTML:

<div id="popup">I'm a popup</div>

JS:

(function ($) {
    $.fn.dialogPlugin = function (options, name, val) {

        var
            // setter function close
            fnClose = null,

            // function when close
            fnMyClose = function() {
                alert("This is plugin's close behavior");
                if (fnClose)
                    fnClose();
            };

        if (options == "option") {
            if (name == "close" && $.isFunction(val)) {
                fnClose = val;
                val = fnMyClose;
            }
        } 
        else {
            if (options.close)
                fnClose = options.close;

            options.close = fnMyClose;
        }

        return (name)
            ? $(this).dialog(options, name, val) //if var == 'undefined'is equal to not send parameters
            : $(this).dialog(options);
    };

})(jQuery);


$("#popup").dialogPlugin({
    close: function() {
        alert("This is user's first close behavior");
    }
});


$("#popup").dialogPlugin("option", "close", function() {
    alert("This is user's second close behavior");
});

РЕДАКТИРОВАТЬ

или более простои элегантный:

(function($){

    var dialog_close = $.ui.dialog.prototype.close;

    $.ui.dialog.prototype.close = function() {

        var self = this;

        alert("This is plugin's close behavior");

        dialog_close.apply(this, arguments);


    };

})(jQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...