Свой jQuery плагин?

В одно из статей о создании своих jQuery плагинах говорится о том, что загрязнять пространство имён $.fn не очень хорошо. Следует объединить методы вашего плагина в один объектный литерал и вызывать их.



(function( $ ){<br>
<br>
  var methods = {<br>
    init : function( options ) { <br>
      // А ВОТ ЭТОТ<br>
    },<br>
    show : function( ) {<br>
      // ПОДХОД<br>
    },<br>
    hide : function( ) {<br>
      // ПРАВИЛЬНЫЙ<br>
    },<br>
    update : function( content ) {<br>
      // !!!<br>
    }<br>
  };<br>
<br>
  $.fn.tooltip = function( method ) {<br>
    <br>
    // логика вызова метода<br>
    if ( methods[method] ) {<br>
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));<br>
    } else if ( typeof method === 'object' || ! method ) {<br>
      return methods.init.apply( this, arguments );<br>
    } else {<br>
      $.error( 'Метод с именем ' +  method + ' не существует для jQuery.tooltip' );<br>
    } <br>
  };<br>
<br>
})( jQuery );<br>
<br>
// вызывает метод init<br>
$('div').tooltip(); <br>
<br>
// вызывает метод init<br>
$('div').tooltip({<br>
  foo : 'bar'<br>
});<br>
<br>
// вызывает метод hide<br>
$('div').tooltip('hide'); <br>




А что делать в том случае, когда jquery плагин самостоятельный, то есть не требует привязки к какому-то элементу DOM, по типу $.ajax, $.get и тд., но при этом мне необходимо объединить методы плагина? $.tooltip('blablamethod');
  • Вопрос задан
  • 11209 просмотров
Решения вопроса 1
Piterski
@Piterski Автор вопроса
В общем как оказалось jQuery.fn = jQuery.prototype. А значит в моем случае, если хочется использовать методы плагина таким образом, то пространство имен $.fn вообще не нужно.

(function($){
    var methods = {
        init : function(options) { 
            console.log('init');
        },
        show : function( ) {
        
        },
        hide : function( ) {
        
        },
        update : function(content) {
            console.log(content);
        }
    };

    $.myPlug = 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 + ' не существует для $.chats' );
        } 
    };
})(jQuery);

$.myPlug(); // init

$.myPlug('update', 'Привет мир'); // Привет мир

$.myPlug('blalbla') // $.error
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
conf
@conf
Ruby developer
А что мешает сделать что-то типа
$.tooltip = {
  update: function() {},
  init: function() {},
  show: function() {} // и т.п.
}

и вызывать как $.tooltip.show() ?
Ответ написан
UZER2006
@UZER2006
В таком случае логично расширить глобальное пространство jQuery
$.tooltip = function(){
//код плагина
}
Применительно к коду выше, по идее, можно что-то типа вот так
$.tooltip = function(method){
var methods = {
init: function( options ) {
// А ВОТ ЭТОТ
},
show: function( ) {
// ПОДХОД
},
hide: function( ) {
// ПРАВИЛЬНЫЙ
},
update: function( content ) {
//!!!
}
};

// логика вызова метода
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' );
}
}
Ответ написан
BRAGA96
@BRAGA96
Если Ваш плагин не требует привязки к DOM элементу, то можно использовать такой вариант:
$.extend({
	// Определяем имя плагина
	plugin: function(params) {
		// Соединяем переданные настройки плагина с настройками по умолчанию
		var setting = $.extend(true, {}, params, {
			state: true,
			key: 'prop'
		});
		// Основной код плагина
	}
});

// Использование
$.plugin({
	state: false
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Artezio Витебск
от 2 800 до 3 300 $