Пространство имен плагина jQuery для определенных объектов - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь создать плагин jQuery, который будет добавлять новые функции пространства имен к объекту (объектам) контекста, сохраняя полную цепную способность. Я не уверен, возможно ли это, но вот пример того, что у меня есть:

(function ($) {
    var loadScreen = $('<div />').text('sup lol');

    $.fn.someplugin = function (args) {
        var args = args || {},
            $this = this;

        $this.append(loadScreen);

        return {
            'caption' : function (text) {
                loadScreen.text(text);
                return $this;
            }
        };
    }
})(jQuery);

Это нормально работает, если я делаю $(document.body).someplugin().caption('hey how\'s it going?').css('background-color', '#000');

Однако мне также нужна способность сделать $(document.body).someplugin().css('background-color', '#000').caption('hey how\'s it going?');

Поскольку .someplugin() возвращает собственный объект, а не объект jQuery, он не работает должным образом. Мне также нужно иметь возможность позже получить доступ .caption() к $(document.body). Так, например, если переменная не установлена ​​для начального $(document.body).someplugin(). Это означает, что каким-то образом .caption() будет установлен через $.fn.caption = function () ... только для объекта document.body. Это та часть, в которой я не совсем уверен, что это возможно. Если нет, то, я думаю, мне придется согласиться с требованием, чтобы переменная была установлена, чтобы поддерживать цепочку функций плагина.

Вот пример кода того, что я ожидаю:

$(document.body).someplugin().css('background-color', '#000');
$('.non-initialized').caption(); // Error, jQuery doesn't know what caption is
$(document.body).caption('done loading...');

Вот что я готов согласиться, если это невозможно или просто очень неэффективно:

var $body = $(document.body).someplugin().css('background-color', '#000');
$('.non-initialized').caption(); // Error, jQuery doesn't know what caption is
$body.caption('done loading...');

1 Ответ

0 голосов
/ 30 января 2012

Метод jQuery, который должен быть цепочкой jquery, ДОЛЖЕН возвращать объект jQuery или объект, который поддерживает все методы jQuery.Вы просто должны решить, хотите ли вы, чтобы ваш плагин был цепным для других методов jQuery, или вы хотите, чтобы он возвращал ваши собственные данные.Вы не можете иметь оба.Выберите один.

В примерах кода вы можете просто определить более одного метода плагина, .someplugin() и .caption().У jQuery нет средств для реализации метода плагина jQuery, который применяется только к одному конкретному объекту DOM.Но нет ничего плохого в том, чтобы сделать метод доступным для всех объектов jQuery, и вы можете использовать его только для тех, для которых он имеет смысл.

Думаю, вы можете использовать это:

(function ($) {
    var loadScreen = $('<div />').text('sup lol');

    $.fn.someplugin = function (args) {
        var args = args || {},
            $this = this;

        $this.append(loadScreen);
        return(this);
    }

    $.fn.caption = function (text) {
        loadScreen.text(text);
        return this;
    }
})(jQuery);

$(document.body).someplugin().css('background-color', '#000');
$('.non-initialized').caption('whatever');
$(document.body).caption('done loading...');

Если между двумя .caption() звонками должна быть какая-то связь, пожалуйста, объясните это дальше, потому что я не понимаю этого из вашего вопроса.

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