Свой 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');
  • Вопрос задан
  • 11238 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
conf
@conf
Ruby developer
А что мешает сделать что-то типа
$.tooltip = {
  update: function() {},
  init: function() {},
  show: function() {} // и т.п.
}

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

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

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

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект