Проблема с setTimeout() jQuery

M2
На сайте с 11.01.2011
Offline
341
1730

Добрый день, друзья! :)

Сделал достаточно топорную функцию:


function toggleImage()
{
var curImg = $('.slider').css('background-image');
var domain = 'http://site.ru/data/';
var url = 'url("' + domain + '")'

if (curImg == 'url("http://site.ru/data/01.jpg")')
{
$('.slider').css('background-image', 'url(\'http://site.ru/data/02.jpg\')');
}
else if (curImg == 'url("site.ru/data/02.jpg")')
{
$('.slider').css('background-image', 'url(\'http://site.ru/data/03.jpg\')');
}
else if (curImg == 'url("http://site.ru/data/03.jpg")')
{
$('.slider').css('background-image', 'url(\'http://site.ru/data/04.jpg\')');
}
else if (curImg == 'url("http://site.ru/data/04.jpg")')
{
$('.slider').css('background-image', 'url(\'http://site.ru/data/05.jpg\')');
}
else if (curImg == 'url("http://site.ru/data/05.jpg")')
{
$('.slider').css('background-image', 'url(\'http://site.ru/data/01.jpg\')');
}
}

и сказал:


setTimeout("toggleImage();", 2000);

почему-то автоматом загружает только до 03.jpg, дальне не идёт :( хотя я строки просто копировал и всё... что может быть не так?

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
H
На сайте с 09.10.2012
Offline
11
#1

Заменить setTimeout на setInterval?

M2
На сайте с 11.01.2011
Offline
341
#2

Спасибо огромное, милый друг! Выручил просто несказанно! :)

---------- Добавлено 16.05.2013 в 15:01 ----------

Теперь не получается остановить )))

Делаю так:


var intervalID = setInterval("toggleImage();", 2000);

потом у меня несколько функций на каждой из которых надо вырубать toggleImage(). Делаю:


function first()
{
/* здесь тело функции */
clearInterval(window.intervalID);
}

не вырубается. Если без window - то же самое.

H
На сайте с 09.10.2012
Offline
11
#3

Нужно смотреть весь код "наживую", так сложно сказать, в чем именно проблема

M2
На сайте с 11.01.2011
Offline
341
#4

Привожу весь код, относящийся к сути:


jQuery(document).ready(function()
{

var interval = setInterval("toggleImage();", 5000);
window.stopInterval = 0;

if (window.stopInterval == 1)
{
clearInterval(interval);
}
else
{

}


function first()
{
$('.slider').css('background-image', 'url(\'/data/01.jpg\')');
window.stopInterval = 1;
$('li').removeClass('active');
$('.first').addClass('active');

}

Т.е. в функции я вроде выставляю глобальную переменную, но основному коду на это почему-то пофиг..... браузер лиса, если это имеет значение....

H
На сайте с 09.10.2012
Offline
11
#5

А ему и должно быть пофиг.

Ваша функция document.ready исполняется один раз, на момент, когда у вас stopInterval = 1, тот код уже отработал.

M2
На сайте с 11.01.2011
Offline
341
#6

И как выйти из ситуации?

H
На сайте с 09.10.2012
Offline
11
#7

Когда вам нужно остановить процесс?

Сюда хорошо бы вписался механизм пользовательских событий.

Пример (останавливаем на последней):

...

куда-то в начало добавляем такое:

(

function($)

{

var o = $({});

$.subscribe = function() {

o.bind.apply( o, arguments );

};

$.unsubscribe = function() {

o.unbind.apply( o, arguments );

};

$.publish = function() {

o.trigger.apply( o, arguments );

}

}

)(jQuery);

Далее изменения по коду:

else if (curImg == 'url("http://site.ru/data/05.jpg")')

{ //посылаем событие остановить таймер

$.publish('stop_timer');

}

$(document).ready(function()

{

window.interval = setInterval(....);

//подписываемся на событие остановки таймера. как только оно будет запрошено (publish), таймер обнулится.

$.subscribe('stop_timer',function(e)

{

clearInterval(window.interval);

});

});

M2
На сайте с 11.01.2011
Offline
341
#8

Так а это... вы же говорите, что document.ready работает только один раз при загрузке. А мне процесс надо остановить вообще в сторонней функции js, но которая находится за пределами document.ready.

H
На сайте с 09.10.2012
Offline
11
#9

тут начинает работать модель событий. :)

в document.ready мы просто подписываемся на срабатывание определенного события, и задаем его обработчик на будущее.

все равно как мы обрабатываем щелчок мышки или что-то подобное.

а вызвать-инициировать это событие мы можем из любого места, и его обработчик запустится.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий