Как подчинить себе цикл
Здравствуйте, кодопроизводители! Низачто не могу догадаться как останавливать в нужный момент цикл, и запускать его для нужного селектора!
Ситуация такая... в окне "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>
|
Цитата:
|
Цитата:
|
BETEPAH, кстати да! Спасибо что напомнили! Совсем из головы он вылетел.... был у меня один замечательный код с использованием clearInterval.
Щас будем пробовать. |
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... или хотя бы прошу ссылку на раздел в учебнике о такой конструкции? Спасибо! |
Собственно сам нашел объяснение конструкции, она называется "Тройной оператор"
... кому интересно, это упрощенный способ условного присваивания значений переменным.... суть: a ? b : с если a = true , то возвращается b, если нет то возвращается с ...т.е. это тоже что if () { } else{ } |
Цитата:
http://javascript.ru/cond |
Цитата:
В итоге вышел непосредственно на книжку в которой этот код со СлайдШоу и был, там благо все разъяснялось по сути. Но это уже через столько времени :( Т.е. по факту что такому чуваку как я делать если возник подобный вопрос? выход - смотреть в эту тему, в 6 ответ (который конечно школярский, не спорю).... но ведь часто бывает что есть похожий вопрос на форуме, который так и остался без ответа... и гадаешь то ли автор до сих пор "в дураках", то ли сам решил, но другим не дает?... а это не есть "кодеры всех стран дуинг cucha"! |
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');
}
};
|
Цитата:
|
Цитата:
var next = function(){
if (current.next().length){
if (!current.next().hasClass('show')) {
return current.next();
};
};
return $('.rotator ul li:first');
};
|
ksa,
что-то то же не аналогичен, не работает у меня.... :-? |
Цитата:
|
Цитата:
var next = (function(){
if (current.next().length){
if (!current.next().hasClass('show')) {
return current.next();
};
};
return $('.rotator ul li:first');
})();
|
Или так...
var next = $('.rotator ul li:first');
if (current.next().length){
if (!current.next().hasClass('show')) {
next = current.next();
};
};
|
ksa,
по ней каждый раз идет выбор следующего элемента, к которому применяется addClass и всякие анимации... выбор через поиск следующего из всех элементов в том же (что и current) контейнере, до тех пор пока lenght = 1, как только lenght = 0 выбираем первый из всех элемент.... вот собсно... ДА! ksa, Спасибо! Оба кода рабочие! Просто чумовые! Спасибо Вам за отзывчивость и оперативность! :yes: |
Цитата:
|
| Часовой пояс GMT +3, время: 23:47. |