Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2013, 21:25
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

Как подчинить себе цикл
Здравствуйте, кодопроизводители! Низачто не могу догадаться как останавливать в нужный момент цикл, и запускать его для нужного селектора!

Ситуация такая... в окне "frame" появляются сменяя друг друга картинки, появление идет через нулевое opacity, смена через больший z-index и все это находится в цикле.
Еще присутствует контрольная панель "change_bar", клик по элементам которой меняет набор сменяемых картинок... два набора #div1 и #div2..... клик по "#c1" ставит #div1, по "#c2" - #div2.

Код этот я нагуглил и очень мне он нравится, но как его приспособить под сменяемые наборы - меня просто оно похоронило! Т.е. изначально стоит первый набор (тут всеработает), который бесконечно чередует свои p1 и p2...... клик по "#c2" - останавливает цикл для набора "div1" и запускает его для "div2" (чередуются p3 и p4)... если кликаем на тот же набор то он останавливается и запускается сначала. И вот в этих остановках/запусках цикла - проблемы!

И что только не перелопатил return false, .queue(), stop(), unbind(), флаги, if, break, обнуления, даже jQuery.fx.off = true;

.... и либо цикл напроч вырубает, либо ему хоть бы что.... и казалось бы столько разных методов - но без результатно...

Посоветуйте как можно обуздать цикл? Благодарен за любые советы!


Jquery:
function theRotator() {	
	
	$('div.rotator ul li').css({opacity: 0.0});/* прозрачность всех картинок */
 
	/* Берем первую картинку и показываем ее (по пути включаем полную видимость) */
	$('div.rotator ul li:first').animate({opacity: 1.0}, 700);	
	
	setInterval('rotate()',4000);	
	
}

function rotate() {	
	/* Берем первую картинку */
	var current = ($('div.rotator ul li.show')?  $('div.rotator ul li.show') : $('div.rotator ul li:first'));
 
	/* Берем следующую картинку, когда дойдем до последней начинаем с начала */
	var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('div.rotator ul li:first') :current.next()) : $('div.rotator ul li:first')); 

 
	/* Прячем текущую картинку */
	current.removeClass('show')
	.animate({opacity: 0.0}, 700, function(){/* эффект затухания картинок, show имеет больший z-index */
		next.addClass('show')		
		.animate({opacity: 0.0}, 500)		
		.animate({opacity: 1.0}, 700);					
		});	
};

 
$(document).ready(function() {		
	
	theRotator(); /* Запускаем слайдшоу */
		

	/* Кликаем любую li в change_bar */
	
	$('#change_bar li').each(function(index, element){
		$(element).on("click", function(){
					
			/* убираем старый div в frame > ul > li */

			/* ставим новый div в frame > ul > li */	
		});
	});
});


HTML:
<head>
<style type="text/css">
#frame{
	 position:absolute;
	 overflow: hidden; 	 
}
#frame > ul{
	position:relative;
}

#change_bar{
	 position:relative; 	 
}
#change_bar > ul{
	position:relative;
}
div.rotator {
	position:relative; 	
}
div.rotator ul li {
	position:absolute; 
}
div.rotator ul li.show {
	z-index:500;	
}
</style> 

<script type="text/javascript"></script>
 
</head>

<body>
 
 
<div id="frame">   
<ul>
<li> 
  <div class="rotator" id="div1">
    <ul>
      <li class="show"><img src="p1.gif"/></li>
      <li><img src="p2.gif"/></li>            
    </ul>
  </div>
</li>  
  
<li>  
  <div class="rotator" id="div2">
    <ul>      
      <li><img src="p3.gif"/></li>
      <li><img src="p4.gif"/></li>      
    </ul>
  </div> 
</li>  
   
</ul>
</div> 
 
 
 
<div id="change_bar"> 
 
  <ul>
    <li id="c1">  <img src="1.gif"/>  </li>
    <li id="c2">  <img src="2.gif"/>  </li> 
  </ul>

</div> 
 
 
</body>
Ответить с цитированием
  #2 (permalink)  
Старый 17.11.2013, 12:34
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

Сообщение от Rise Посмотреть сообщение
Какие проблемы то?
....так должно быть! Но этого еще нет (события при кликах).
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2013, 12:38
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

Сообщение от wreder
И что только не перелопатил return false, .queue(), stop(), unbind(), флаги, if, break, обнуления, даже jQuery.fx.off = true;
clearInterval пробовали?
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2013, 13:58
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

BETEPAH, кстати да! Спасибо что напомнили! Совсем из головы он вылетел.... был у меня один замечательный код с использованием clearInterval.

Щас будем пробовать.
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2013, 16:46
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

BETEPAH, Спасибо, пока получается! Вам +1...

..но если не сложно - еще один вопрос: код изначально рассчитан был на один ID , но нужно применить его к нескольким элементам с общим классом...

в том месте где мне нужно запустить код смены я пишу $("#frame li").each(theRotator); т.е. для каждого элемента, но тогда в коде rotate() нужно как то указать что выбор идет через текущий элемент, т.е. видимо через $(this)... но саму суть выражения (по которому идет селект) я не понимаю:

var current = ($('div.rotator ul li.show')?  $('div.rotator ul li.show') : $('div.rotator ul li:first'));


и что-то не могу найти разъяснение.... Т.е. этот current должен зависеть от кликнутого во #frame <li>.

Подскажите как вставить this.... или что это за конструкция после current... или хотя бы прошу ссылку на раздел в учебнике о такой конструкции? Спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 20.11.2013, 13:51
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

Собственно сам нашел объяснение конструкции, она называется "Тройной оператор"

... кому интересно, это упрощенный способ условного присваивания значений переменным.... суть:

a ? b : с

если a = true , то возвращается b, если нет то возвращается с

...т.е. это тоже что

if () {
}
else{
}
Ответить с цитированием
  #7 (permalink)  
Старый 20.11.2013, 13:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от wreder
кому интересно
Мы букварь прочли в самом начале...
http://javascript.ru/cond
Ответить с цитированием
  #8 (permalink)  
Старый 20.11.2013, 14:55
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

Сообщение от ksa Посмотреть сообщение
Мы букварь прочли в самом начале...
http://javascript.ru/cond
Согласен! Но мне за сутки эту ссылку так никто и не дал, хотя просьба была. И то что это "Условный оператор" я не знал, поэтому что искать в учебнике - неясно, поиск аналогичного синтаксиса типа что-то = чего-то ? тот-то : это не помог...

В итоге вышел непосредственно на книжку в которой этот код со СлайдШоу и был, там благо все разъяснялось по сути. Но это уже через столько времени

Т.е. по факту что такому чуваку как я делать если возник подобный вопрос? выход - смотреть в эту тему, в 6 ответ (который конечно школярский, не спорю).... но ведь часто бывает что есть похожий вопрос на форуме, который так и остался без ответа... и гадаешь то ли автор до сих пор "в дураках", то ли сам решил, но другим не дает?... а это не есть "кодеры всех стран дуинг cucha"!
Ответить с цитированием
  #9 (permalink)  
Старый 20.11.2013, 15:20
Интересующийся
Отправить личное сообщение для wreder Посмотреть профиль Найти все сообщения от wreder
 
Регистрация: 05.09.2013
Сообщений: 22

ksa,
для лучшего понимания (себе) хочу расписать через if / else вот эту строчку из кода:

var next = ((current.next().length) ? ((current.next().hasClass('show')) ? $('.rotator ul li:first') :current.next()) : $('.rotator ul li:first'));


но мой вариант что-то не аналогичен ей, можете подсказать что не так?
Мой вариант:

var next = function(){
	
	if (current.next().length){
		      	if (current.next().hasClass('show')) {
		             $('.rotator ul li:first');
				}
				else{
					 current.next();
				}						 
	}
	else{
		$('.rotator ul li:first');
	}	
};

Последний раз редактировалось wreder, 20.11.2013 в 15:24.
Ответить с цитированием
  #10 (permalink)  
Старый 20.11.2013, 15:41
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от wreder
но мой вариант что-то не аналогичен ей, можете подсказать что не так?
У твоей функции нет возвращаемого значения...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Как обработать бесконечный цикл? Iktash Элементы интерфейса 3 16.11.2012 10:26
Как организовать RichEdit arma Элементы интерфейса 2 18.02.2010 14:57
форма как в ExtJS 2 magistr_bender Общие вопросы Javascript 0 11.09.2008 16:01