Strict Standards: Resource ID#30 used as offset, casting to integer (30) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#32 used as offset, casting to integer (32) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#33 used as offset, casting to integer (33) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Остановка автоскроллинга
ТвойWeb » WebMaster класс » JavaScript » Остановка автоскроллинга

Страниц (1): [1]
 

1. Самоделкин - 03 Июля, 2007 - 13:45:27 - перейти к сообщению
Есть массив фотографий, который перебирается кнопками вверх и вниз.
Пытаюсь сделать, чтобы при удержании кнопки мышкой (onMouseDown) фотографии скроллились сами, останавливаясь при отпускании. Но при отпускании кнопки (onMouseUp) цикл всё время "проезжает одну остановку".

Данные:
document.getElementById("prt" ) - это окно, в котором находятся картинки.
countertwo - счётчик массива
При загрузке страницы выпадает случайная картинка, num2 - её номер в массиве.
ppaintfiles - массив имён файлов
ppaintwdt и ppainthgt - соответственно ширина и высота членов массива.

Вот общая функция скроллинга (для кнопочных событий onClick, true - вперёд, false - назад). Здесь всё работает.
CODE:
function scrollprt(direction) {
dlina = ppaintfiles.length;
// назначаем счётчик на выпавший портрет
countertwo = num2;
// Нижняя кнопка - вниз
if (direction == true)
{
if (countertwo < dlina-1)
{countertwo++;
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo];
width=ppaintwdt[countertwo];
height=ppainthgt[countertwo];}
}
else {countertwo=0;
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo];
width=ppaintwdt[countertwo];
height=ppainthgt[countertwo];}
}
}
// Верхняя кнопка - вверх
else
{
if (countertwo > 0)
{countertwo--
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo];
width=ppaintwdt[countertwo];
height=ppainthgt[countertwo];}
}
[b]else {countertwo=dlina-1;
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo];
width=ppaintwdt[countertwo];
height=ppainthgt[countertwo];}
}
}
// Заносим результат прокрутки в счётчик
num2 = countertwo;
}

Вот функция для остановки автоскроллинга с попыткой вернуться на нужную картинку (всё равно одну проезжает. Срабатывает только clearInterval()).
Переменные moverup и moverdn объявлены в основном скрипте.
CODE:
function stopcadr(direction) {
if (direction == true)
{
countertwo--;
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo-1];
width=ppaintwdt[countertwo-1];
height=ppainthgt[countertwo-1];}
clearInterval(moverdn);
}
else
{
countertwo++;
with (document.getElementById("prt"))
{src=ppaintfiles[countertwo+1];
width=ppaintwdt[countertwo+1];
height=ppainthgt[countertwo+1];}
clearInterval(moverup);
}
}

Код кнопок
CODE:
<input type="button" id="up" style="background: #099 url(arrow1.gif) no-repeat center;" onClick="scrollprt(false);" onMouseDown="moverup=setInterval('scrollprt(false)',500);" onMouseUp="stopcadr(false);"><br>
<input type="button" id="dn" style="background: #099 url(arrow2.gif) no-repeat center;" onClick="scrollprt(true);" onMouseDown="moverdn=setInterval('scrollprt(true)',500);" onMouseUp="stopcadr(true);">

Не подскажете, где ошибка и как её устранить?
2. ETC - 03 Июля, 2007 - 14:38:48 - перейти к сообщению
Мммм, в таком месиве кода разобраться невозможно.
Можно готовую страничку со скроллом?
3. Furax - 04 Июля, 2007 - 03:48:15 - перейти к сообщению
Самоделкин
А какого чёрта к кнопкам прописаны и onMouseDown, и onClick?

Поясняю наглядно, что происходит, когда ты нажимаешь кнопку.
1. Срабатывает событие onMouseDown, вызов setInterval(...).
2. Через 500 мс (+- сколько-то - в стандарте JavaScript ничего не сказано о том, через какое время после вызова функции setInterval() должно произойти первое выполнение её первого аргумента) происходит первая смена картинки.
3. Картинка меняется каждые 500 мс.
4. После отпускания кнопки мыши срабатывает событие onMouseUp и убивает интервальный вызов прокрутки.
5. Сразу после него срабатывает событие onClick, которое и делает один "лишний" шаг.

Поэтому onClick надо убрать. Если же тебе всё же хочется оставить его из соображений совместимости со старыми браузерами (в чём, однако, в настоящее время нет необходимости), то делай проверку типа браузера.

И ещё несколько замечаний.
1. Зачем в функции смены изображения в случае шага вперёд и назад разные ветки меняют картинку? Лучше одна после конструкции if...else.
2. Функция прекращения прокрутки не должна делать ничего кроме отмены интервала.
3. Попробуй убрать мышь с кнопки, не отпустив клавишу мыши, и отпустить кнопку вне её - после этого твой скрипт уже ни при каких условиях не прекратит менять картинки. Добавь обработчик события onMouseOut, который тоже должен прекращать листать картинки.
4. Я бы посоветовал вместо setInterval() использовать setTimeout(), причём вызывать его в конце функции смены картинки, а уж её [функцию] вызывать из обработчика onMouseDown. Таким образом смена картинок начнётся сразу после нажатия кнопки. Только не забудь поменять clearInterval() на clearTimeout().

Успехов!
4. Самоделкин - 13 Июля, 2007 - 06:31:11 - перейти к сообщению
Наконец-то добрался до форума. Спасибо, буду разбираться.
А зачем onClick, объясняю. Основной вариант: щёлкаешь кнопку - меняется изображение. Но поскольку изображений больше 20, а по условиям игры из них надо выбрать нужное, я и решил сделать дополнительную возможность прокрутки удержанной мышкой.
5. Furax - 13 Июля, 2007 - 06:48:27 - перейти к сообщению
Самоделкин
Стало быть, дополнительный вариант самодостаточен. Основной не нужен.
6. Самоделкин - 13 Июля, 2007 - 07:22:36 - перейти к сообщению
Furax
Уже понял. Спасибо, всё получилось.

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0322]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33