Плагин Jquery позволяет использовать несколько экземпляров

Я использую шаблон jQuery для плагина я пишу. По сути, он просто запускает вызов ajax и заменяет содержимое элемента, на котором он работает. Пример:

Имя моего плагина 'getContent'

$('.container').getContent({
    html : 'foo'
});

Очень упрощенная версия плагина, однако в самом низу шаблона есть вот это:

// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations

$.fn[pluginName] = function(options) {
    this.each(function() {
        if (!$.data(this, "plugin_" + pluginName)) {
            $.data(this, "plugin_" + pluginName, new Plugin(this, options));
        }
    });

    // chain jQuery functions
    return this;
};

Очевидно, он выполняет некоторые проверки, чтобы убедиться, что pluginName уже привязан к элементу. В данном случае это так, и плагин не запускается, когда вы пытаетесь сделать это позже на том же экземпляре страницы.

Является ли правильным способом исправить мою проблему буквально просто удалить if вокруг раздела new Plugin?


person Shannon Hochkins    schedule 06.08.2014    source источник


Ответы (1)


чтобы иметь возможность запускать плагин для нескольких экземпляров, вам нужно иметь новое закрытие для каждого экземпляра, попробуйте следующий код:

function getContentFunc(elem,options){
    //things you want your plugin to do
};

$.fn[pluginName] = function(options) {
    if ($.data(this, "plugin_" + pluginName)) return;
    return $(this).each(function() {
        getContentFunc(this,options);
        $.data(this, "plugin_" + pluginName);
    });
};

посмотрите очень простой плагин, сделанный тем же методом ЗДЕСЬ

person Amin Jafari    schedule 06.08.2014
comment
Это не работает, извините, если я добавлю журнал консоли в вашу функцию сокращения, он сработает только один раз. - person Shannon Hochkins; 06.08.2014
comment
ну, конечно, он срабатывает один раз, потому что у нас есть только один тег p в коде, скопируйте тот же тег p и добавьте console.log() и увидите, что он срабатывает дважды! - person Amin Jafari; 06.08.2014
comment
Что, если я захочу запустить его с тем же тегом p? - person Shannon Hochkins; 07.08.2014
comment
ну, для укороченного примера это не имело бы смысла, но если вы хотите сделать такое, вам нужно удалить if и $.data(this, "plugin_" + pluginName); - person Amin Jafari; 07.08.2014