разработка плагина 
		
		
		
		Здравствуйте, изучаю написание собственных плагинов на Jquery. Есть такое задание:  
	- Создать свой метод inOut, который эмулирует функционал методов slideToggle и fadeToggle Сами методы slideToggle и fadeToggle в коде не использовать! - Метод должен вызываться примерно так: $('div.container').inOut(); - Метод inOut должен отрабатываться при нажатии кнопки "Нажми меня" примерно так: $('button').on('click', function(){ $('div.container').inOut(); }); - Подсказки: - использовать animate - jQuery допускает использование строки "toggle", как значения для св-в "height" и "opacity" - предусмотреть возможность изменения скорости я сделал так 
(function($) {
  $.fn.mySlideToggle = function(){
     this.animate({'height':'toggle','opacity':'toggle'},{duration : 3000});
     return this;
  };
})(jQuery);
$(function(){
  $('button').on('click',function(){
		$('.container').mySlideToggle();
	});
	});
<div class="container"> <h2>Какой-то текст</h2> <p> Неспроста свинцовый сосуд мгновенно открывает квазиупругую колбу. Карусель быстра и кратковременна. Часто бывает, что ядерная лапка груба и продуманна. Очевидно, феноменальная шестерня брезентового комплекта бережно увеличивает тайную лампу. Изящное значение резко и метастабильно. Платиновая инерция перегоревшего изолятора образовывает разделение. Свет преднамерен и замысловат. Шланг предумышленен. Деревянное открытие периодично. Базальтовый проектировщик груб. Замкнутый болт наполняет шип. Нагруженность эпизодична и кратковременна. </p> </div> <p><button>Нажми меня</button></p> Объясните пожалуйста как правильно решить эту задачу и как добавить возможность изменения скорости. Подозреваю что надо вытянуть свойство duration метода animate, но как?  | 
	
		
 Шаблон плагина 
		
		
		
		Moloch, 
	
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<style type="text/css">
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
(function($) {
    $.fn.inOut = function(opt) {
        var defaults = {
            'duration': 3000, //продолжительность выполнения анимации в ms
            'easing': 'swing' //изменение скорости анимации
        };
        opt = $.extend(defaults, opt);
        return this.each(function(index, self) {
            $(self).animate({
                'height': 'toggle',
                'opacity': 'toggle'
            }, {
                'duration': opt.duration,
                'easing': opt.easing
            });
        })
    };
})(jQuery);
$(function() {
    $('button').on('click', function() {
        $('.container').inOut({'duration': 1500});
    });
});
</script>
  <title></title>
</head>
<body>
<div class="container">
	<h2>Какой-то текст</h2>
	<p>
		Неспроста свинцовый сосуд мгновенно открывает квазиупругую колбу. Карусель быстра и кратковременна. Часто бывает, что ядерная лапка груба и продуманна. Очевидно, феноменальная шестерня брезентового комплекта бережно увеличивает тайную лампу. Изящное значение резко и метастабильно. Платиновая инерция перегоревшего изолятора образовывает разделение. Свет преднамерен и замысловат. Шланг предумышленен. Деревянное открытие периодично. Базальтовый проектировщик груб. Замкнутый болт наполняет шип. Нагруженность эпизодична и кратковременна.
	</p>
</div>
<p><button>Нажми меня</button></p>
</body>
</html>
 | 
	
		
 Премного благодарен, объесните пожалуйста что за магия творится вот в этой части кода? 
	
opt = $.extend(defaults, opt);
        return this.each(function(index, self) {
            $(self).animate({
                'height': 'toggle',
                'opacity': 'toggle'
            }, {
                'duration': opt.duration,
                'easing': opt.easing
            });
 | 
	
		
 Moloch, 
	1. параметры которые получает функция дополняются теми параметрами по умолчанию, которых в них нет. было {'duration': 1500} стало {'duration': 1500, 'easing': 'swing' } 2. всем элементам в селекторе назначается animate -- можно и без цикла each в данном случае -- each удобен в плане расширения плагина.  | 
	
		
 мне непонятно как extend в данном случае работает. Есть объект defaults я вызываю extend() и объединяю го с объектом opt и все это присваиваю переменной opt. затем возвращаю коллекцию объектов . а какую роль играет переменная self? 
	 | 
	
		
 Цитата: 
	
 можно совсем без параметров $('.container').inOut(); или так $('.container').inOut({}); если аргументов нет тогда параметры полностью возьмутся из defaults. более добавить нечего self равен this или элементу 'div.container' нельзя this.animate у элемента нет никакого свойства animate но можно $(this).animate -- потому что у обьекта jquery -> $(this) есть метод animate  | 
	
		
 а если мне нужно еще чтобы по нажатию на конопку менялся цвет фона блока , то это так делается? 
	
(function($) {
    $.fn.inOut = function(opt) {
        var defaults = {
            'duration': 3000, //продолжительность выполнения анимации в ms
            'easing': 'swing', //изменение скорости анимации
            background_color :'green'
        };
        opt1 = $.extend(defaults, opt);
        return this.each(function(index, self) {
            $(self).animate({
                'height': 'toggle',
                'opacity': 'toggle'
            }, {
                'duration': opt.duration,
                'easing': opt.easing
            }).css('background-color',opt.background_color);
        })
    };
})(jQuery);
$(function() {
    $('button').on('click', function() {
        $('.container').inOut({'duration': 1500,background_color:'pink'});
    });
});
почему если я не задаю background_color:'pink' то фон по умолчанию не становится зеленым?  | 
	
		
 а, разобрался opt = $.extend(defaults, opt); вот эта строчка нужна для перезаписи свойств по умолчанию 
	 | 
	
		
 opt = $.extend(defaults, opt); 
	 | 
	
		
 Цитата: 
	
  | 
	
		
 Moloch, 
	для медитации - дальнейшее расширение плагина и его новые возможности ))) 
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<style type="text/css">
</style>
<script src="https://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
(function($) {
    var defaults = {
        'animate': true,
        'css': true,
        'duration': 3000, //продолжительность выполнения анимации в ms
        'easing': 'swing', //изменение скорости анимации
        'background_color': 'green'
    };
    $.fn.inOut = function(opt) {
        opt = $.extend({}, defaults, opt);
        return this.each(function(index, self) {
            var elem = $(self);
            opt.animate && elem.animate({
                'height': 'toggle',
                'opacity': 'toggle'
            }, {
                'duration': opt.duration,
                'easing': opt.easing
            })
            opt.css && elem.css('background-color', opt.background_color);
        })
    };
    $.inOut = function(el, opt) {
        $(el).inOut(opt)
    };
    $.inOut.setDefaults = function(setNew) {
        defaults = $.extend({}, defaults, setNew)
    }
})(jQuery);
jQuery(function($) {
    function RandColor() {
        var r = Math.floor(Math.random() * (256));
        var g = Math.floor(Math.random() * (256));
        var b = Math.floor(Math.random() * (256));
        var rgb = 'rgb(' + r + ',' + g + ',' + b + ')';
        return rgb;
    }
    $('button').eq(0).on('click', function() {
        $('.container').inOut({
            'duration': 1500,
            background_color: 'pink'
        });
    });
    $('button').eq(1).on('click', function() {
        $('.container').inOut({
            'duration': 1500
        });
    });
    $('button').eq(2).on('click', function() {
        $.inOut('.container');
    });
    $('button').eq(3).on('click', function() {
        var color = RandColor();
        $.inOut.setDefaults({
            background_color: color
        });
        $.inOut('button:gt()', {
            background_color: color,
            animate: false
        })
        $.inOut('.container');
    });
});
</script>
  <title></title>
</head>
<body>
<div class="container">
	<h2>Какой-то текст</h2>
	<p>
		Неспроста свинцовый сосуд мгновенно открывает квазиупругую колбу. Карусель быстра и кратковременна. Часто бывает, что ядерная лапка груба и продуманна. Очевидно, феноменальная шестерня брезентового комплекта бережно увеличивает тайную лампу. Изящное значение резко и метастабильно. Платиновая инерция перегоревшего изолятора образовывает разделение. Свет преднамерен и замысловат. Шланг предумышленен. Деревянное открытие периодично. Базальтовый проектировщик груб. Замкнутый болт наполняет шип. Нагруженность эпизодична и кратковременна.
	</p>
</div>
<p><button>Нажми меня всегда pink</button></p>
<p><button>Нажми меня defaults green $('.container').inOut()</button></p>
<p><button>Нажми меня defaults green $.inOut('.container')</button></p>
<p><button>Изменить цвет по умолчанию</button></p>
</body>
</html>
 | 
	
		
 спасиибо ! буду разбираться =) 
	 | 
| Часовой пояс GMT +3, время: 03:17. |