Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Паттерн плагина jQuery (https://javascript.ru/forum/jquery/35576-pattern-plagina-jquery.html)

prison47 15.02.2013 03:14

Паттерн плагина jQuery
 
Здравствуйте. Разъясните пожалуйста часть конструкции для плагина.
Почти все разобрал что за что отвечает но не понятно концовка. Не могли бы вы объяснить работу строк отмеченных условными комментариями.
;(function($) {

	var defaults = {

	};

	function Nupoll(element, options) {  
		var widget = this;

		widget.config = $.extend({}, defaults, options); 
		widget.element = element;

		this.init();

	}

	Nupoll.prototype.init = function() {

	};

	$.fn.pluginNew = function(options) { 
		new Nupoll(this.first(), options); // ??????????

		return this.first();  // ??????????

	};
} (jQuery) );

danik.js 15.02.2013 03:57

new Nupoll(this.first(), options);

Создается экземпляр Nupoll (вызывается конструктор Nupoll).

this.first() - первый элемент из коллекции.

return this.first() - возвращаем первый элемент, чтобы можно было продолжить цепочку вызовов: $(el).pluginNew().continueChain()

Если плагин должен обработать каждый элемент из коллекции, то обычно делают так:

$.fn.pluginNew = function(options) {
    return this.each(function(){
        // do stuff
    });
}

prison47 15.02.2013 04:22

То есть получается если у меня плагин должен подключатся не к одному к нескольким элементам я использую такой вариант паттерна:
;(function($) {

	var defaults = {

	};

	function Nupoll(element, options) {  
		var widget = this;

		widget.config = $.extend({}, defaults, options); 
		widget.element = element;

		this.init();

	}

	Nupoll.prototype.init = function() {


// код плагина


	};

$.fn.pluginNew = function(options) {
    return this.each(function(){
        // do stuff
    });

	};
} (jQuery) );

danik.js 15.02.2013 04:32

prison47, изучите сначала основы JavaScript, потом уже учитесь делать плагины для jQuery.

<script src="//code.jquery.com/jquery-latest.min.js"></script>
<script>
    (function($) {
     
    $.fn.pluginNew = function(options) {
        return this.each(function(){
            $(this).css('color', 'red');
        });
     
    };
    
    } (jQuery) );
</script>

<div>Bla bla</div>
<div>Тест</div>
<script>
    $('div').pluginNew();
</script>

prison47 15.02.2013 04:41

Основы я как раз таки изучаю и вот такие конструкции не могу понять, в первом случае код плагина мы пишем в Nupoll.prototype.init = function() {
где уже есть доступ к дом элементу. Во втором случае приведенном вами почему-то все отсекается, тот же конструктор. Если у вас есть ссылки где можно подробнее почитать на доходчивом языке, буду признателен :)

danik.js 15.02.2013 05:10

Если вы не заметили, в моем "плагине" не используются какие-то собственные методы, опции и прочее.
this.each(fn) проходит по всем элементам коллекции и вызывает для каждого элемента функцию fn, устанавливая в качестве контекста этот элемент. Делайте с этим элементом что хотите. Я например просто изменил css свойство. Вы можете создавать какие-то объекты к примеру.

Цитата:

Сообщение от prison47
код плагина...

Это все и есть - код плагина. Разве нет?

Цитата:

Сообщение от prison47
где можно подробнее почитать

Посмотрите исходники каких-нибудь плагинов jQuery

prison47 15.02.2013 05:19

Спасибо

prison47 16.02.2013 01:14

Подскажите пожалуйста. В плагине вешаю обработчики клика через on() на ново появляющиеся элементы. Подключаю плагин к нужному элементу. Все работает. Но если нужно подключить плагин на еще один элемент например для срабатывания с другими параметрами, то обработчики клика начинают дублироваться. Если подключить на три элемента, то утраиваются. Что я неправильно делаю? Или многократное подключение плагина вообще не должно быть? Тогда как сделать срабатывание на нескольких элементах с разными параметрами?

рони 16.02.2013 01:21

prison47,
обычно метку ставят если элемент обработан плагином то второй раз его ненадо -- если нужно по новой метку убирают навешивают по новой обработчики и ставят метку

prison47 16.02.2013 01:26

А подробней если можно? Не совсем понимаю


Часовой пояс GMT +3, время: 01:33.