настройки jquery по умолчанию и с несколькими экземплярами

#jquery #jquery-plugins

#jquery #jquery-плагины

Вопрос:

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

Вот его урезанная версия … извините за длину.

 (function() {

    var settings = {};
    var defaults = {
        duration : 1000,
        easingShow : 'easeOutBounce',
        easingHide : 'easeOutQuad'
    };

    var methods = {
        init : function(options) {

            return this.each(function(n) {

                settings = $.extend(defaults, options);

            });

        },

        show : function() {

            // settings used here
        },

        hide : function() {
            // also used here
        }
    };

    $.fn.expander = function(method) {

        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method '   method   ' does not exist on jQuery.expander');
        }

    };

})(jQuery);
  

Я уверен, что это какая-то проблема с пространством имен, поскольку меня это часто смущает.

Спасибо

Ответ №1:

использовать

 settings = $.extend(true, {}, defaults, options);
  

из jquery docs @ http://api.jquery.com/jQuery.extend /

глубокое, если true, слияние становится рекурсивным (иначе. глубокое копирование).
укажите объект для расширения. Он получит новые свойства.
object1 Объект, содержащий дополнительные свойства для объединения.
Укажите дополнительные объекты, содержащие свойства для объединения.

Имейте в виду, что целевой объект (первый аргумент) будет изменен, а также будет возвращен из $.extend(). Однако, если мы хотим сохранить оба исходных объекта, мы можем сделать это, передав пустой объект в качестве целевого.

Чтобы иметь разные настройки для каждого элемента, вы можете сохранить их в каждом элементе с помощью .data()

Посмотрите рабочую демонстрацию:http://jsfiddle.net/roberkules/XvKs8 /

Комментарии:

1. Спасибо, но я думаю, вы пропустили проблему. Проблема не в том, как я устанавливаю переменную settings. Дело в том, что если я установлю его в return this.each( function() {}); части, то он будет недоступен для функции отображения и скрытия. Но если я установлю его снаружи, как я уже сделал, это будет одинаково для каждого элемента, для которого включен плагин.

2. Проверьте демонстрацию, должно получиться то, что вам нужно.

3. Я хотел попытаться избежать использования data (), но я полагаю, что это единственный способ.