#jquery #plugins #jquery-plugins #scope
#jquery #Плагины #jquery-плагины #область действия
Вопрос:
У меня есть плагин jQuery, который следует примеру плагинов / разработки из docs.jQuery.com и у меня возникли проблемы с пониманием того, как сохранить уникальные настройки для каждого элемента, к которому применяется плагин. На странице есть два элемента, к каждому из которых плагин применяется отдельно.
Вот мой код на данный момент:
(function( $ ) {
/* Default settings */
var defaults = {
id: null,
properties: null,
container: '.comp-settings', /* override for .retail or .distressed */
priceLabel: '.comp-section-header span',
slide: slideCallback,
minRange: 100000
};
/* Some public here: $.compSlider('method', options) */
var methods = {
init: function( options ) {
var settings = $.extend( {}, defaults, options );
return this.each(function() {
$(this).slider( settings );
});
}
}
/* Some methods here */
function opt( name ) {
return settings[ name ];
}
/* Plugin namespace */
$.fn.compSlider = function( method ) {
// Method calling logic
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 if ( typeof method === 'string' ) {
return this.slider( method, Array.prototype.slice.call( arguments, 1 ) );
}
};
})( jQuery )
Проблемы:
- Переменная настроек недоступна в функциях плагинов
- Если я сохраню переменную настроек в $ (this).data (‘настройки’) Я все еще не могу получить доступ к $ (this).data (‘settings’) из функции ‘opt’, потому что «this» не является элементом (я считаю, что это окно DOM.)
Любая помощь приветствуется.
Ответ №1:
Вы не можете получить доступ к настройкам в compSlider
функции, потому что в вашем примере они определены в init()
, что делает их локальными для этой функции. Если вы переместили объявление в область действия:
$.fn.compSlider = function( method, options ) {
var settings = $.extend( {}, defaults, options );
};
Тогда вы сможете получить к нему доступ там. Или просто определить его ( var settings;
) в compSlider и удалить var
в init()
было бы достаточно.
Обновить:
В ответ на ваш комментарий, да, извините, забыл о проблеме № 2. Как бы то ни было, вы не сможете получить доступ к настройкам для каждого объекта плагина, потому что вы не можете «спуститься» в область действия. Другими словами, вы не можете получить доступ к локальной переменной функции извне этой функции. И это то, что настройки являются локальными для compSlider
функции (если вы используете структуру, которую я предложил), они ниже по объему, насколько это касается вашей opt()
функции.
Вы, конечно, всегда можете увеличить область действия. Для достижения этого вы могли бы настроить переменную в глобальном пространстве плагина, которая хранит ссылки на все созданные объекты.
var compSliderObjects = [];
$.fn.compSlider = function( method, options ) {
//store objects in compSliderObjects
};
Однако это всего лишь идея, и вам все еще нужно выяснить, как вы хотите получить доступ к compSliderObjects и получить правильные настройки. Будет ли у каждого объекта уникальный идентификатор? Если да, то массив объектов ( {id: 2, settings: data}
). Если нет, вам нужно выяснить, как вы хотите их однозначно идентифицировать, и извлечь их из массива.
Кроме того, вам действительно нужен глобальный доступ к ним? Требуется меньше работы и кода, чтобы просто вызвать объект и получить настройки (как показано на скрипке).
Комментарии:
1. 150 фунтов: я протестировал это, и это не сработало. Проблема все еще существовала, когда последний элемент, к которому применялся метод .compSlider(), обновлял все «настройки» для любого другого элемента, к которому ранее применялся hd .compSlider(). Здесь вы можете увидеть два разных объекта DOM, у обоих из которых были разные настройки, однако оба из которых отображают одни и те же настройки (settings.container, который является селектором): cl.ly/0u0L1i433V3m1d2V0B1Z
2. Не совсем уверен, где вы ошибаетесь, но я вставил jsfiddle, чтобы продемонстрировать, о чем я говорю: jsfiddle.net/kFL5N . Я не уверен, что это то, что вы хотите сделать, но он демонстрирует отдельные настройки для каждого экземпляра.
3. 150PoundsOfDonamite: Смотрите «вопрос № 2» в исходном сообщении. Я думаю, что могу просто использовать метод, который вы предлагаете.
4. 150PoundsOfDonamite: Итак, я просто воспользовался вашим предложением, сохранил в $ (this). данные, а затем методы без обратного вызова (без доступа к «this»), передают настройки явно, спасибо!
5. 150PoundsOfDonamite: Получается, что использование .data() было хорошим шагом, потому что оно создает копию объекта «настройки», и настройки больше не перезаписываются при следующем создании экземпляра объекта compSlider. Мне просто не нравилось вызывать .data() везде, чтобы получить «настройки», но все в порядке, и сейчас все работает хорошо. Спасибо за вашу помощь!