Создаю jQuery-плагин. По инструкции в интернете надо делать так:
$.fn.tooltip = 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 + ' не существует для jQuery.tooltip' );
}
};
Я изменил код так:
$.fn.tooltip = function( method ) {
var options = $.extend( {
'location' : 'top'
}, arguments[1]?arguments[1]:arguments[0]);
// логика вызова метода
if ( methods[method] ) {
methods.init.apply( this, [options] );
var $this = this;
this.each(function () {
return methods[method].apply( $this, [options] );
});
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, [options] );
} else {
$.error( 'Метод с именем ' + method + ' не существует для jQuery.tooltip' );
}
return this;
};
Сам метод init такой:
var methods = {
init : function( options ) {
return this.each(function(){
var $this = $(this);
var data = $this.data();
// Если плагин ещё не проинициализирован
if ( jQuery.isEmptyObject(data) ) {
console.log('method init');
/*
* Тут выполняем инициализацию
*/
$.each(options, function (index, value) {
$this.data(index, value);
});
}
});
},
show : function( options ) {
console.log('method show');
console.log($(this).data());
}
};
Т.е., если плагин для объекта вызывается впервые, неважно какой метод плагина вызывается, сначала происходит его init().
Если же инициализация для объекта уже была произведена, то она пропускается.
Только вот зачем здесь инициализация, что в ней делать нужно? Я в ней записываю все данные в data() объекта.
А значит, в остальных методах плагина, например в show(), я должен брать данные из хранилища data(), а не из передаваемых аргументов arguments.
Но если я вызову плагин для объекта во второй раз с новыми параметрами, то во второй раз init() не выполнится, а значит в data() останутся старые данные, которые были присвоены при первом вызове.
Отсюда следует, что данные из data() брать неправильно, а вместо этого нужно пользоваться просто arguments, которые мы передаём всякий раз при
вызове плагина.
Но тогда зачем нам метод init()?
Продвижение своими сайтами как стратегия роста и независимости