$ this, объявленное во внешнем замыкании и используемое повсеместно, представляет последний элемент, для которого создается экземпляр FrumBox.
Лично я бы не пытался исправить код в его нынешнем виде.Вместо этого используйте шаблон jQuery "Best Practices" .Вот мой шаблон на основе приведенного примера:
(function($){
// **********************************
// ***** Start: Private Members *****
var pluginName = 'xxxxx';
// ***** Fin: Private Members *****
// ********************************
// *********************************
// ***** Start: Public Methods *****
var methods = {
init : function(options) {
//"this" is a jquery object on which this plugin has been invoked.
return this.each(function(index){
var $this = $(this);
var data = $this.data(pluginName);
// If the plugin hasn't been initialized yet
if (!data){
var settings = {
};
if(options) { $.extend(true, settings, options); }
$this.data(pluginName, {
target : $this,
settings: settings
});
}
});
},
myMethod_1 : function(){.....},
myMethod_2 : function(){.....}
};
// ***** Fin: Public Methods *****
// *******************************
// *****************************
// ***** Start: Supervisor *****
$.fn[pluginName] = 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 in jQuery.' + pluginName );
}
};
// ***** Fin: Supervisor *****
// ***************************
})( jQuery );
Примечания:
- Добавьте дополнительные закрытые члены и методы по мере необходимости.
- Открытые члены (методы) являются привилегированными (они имеют доступ к закрытым членам).
- Для обеспечения возможности объединения обязательно используйте шаблон
return this.each(function(index){...})
во всех методах, кроме тех, которые возвращаютконкретное значение. - Возможно, самым сложным аспектом разработки с этим шаблоном (и другими) является понимание того, на что
this
ссылается в каждом контексте.Не забывайте о себе. - Будьте готовы использовать методы javascript
Function.call()
и Function.apply
.Убедитесь, что вы их понимаете. - Супервизор на первый взгляд сложен для понимания, но его не нужно изменять.Это классный кусок кода.
- Создайте плагин для элемента (ов) DOM с помощью
$(selector).pluginNmae()
или $(selector).pluginNmae(options)
, где options
- это литерал объекта "map". - Вызовите методы для инициализированных элементов DOM с помощью
$(selector).pluginNmae('methodName', ...)
- Пример этого шаблона можно найти в выбранном ответе здесь (включая ссылку на скрипку).