![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Здравствуйте!
Подскажите, пожалуйста, как быть с методом setTimeout. У меня есть скрипт, который осуществляет перевод числа из десятичной системы счисления в двоичную, все это делается методом деления в столбик на два. Нужно, чтобы каждый шаг деления выводился на экран с некоторой задержкой. Я сделал так:
Функция count у меня рассчитывает значения каждого шага деления и заносит их в массивы. А функцией vyvod я потом все это вывожу. Здесь идея такая: сначала выводится первый шаг деления, потом методом setTimeout я снова вызываю эту же функцию, но она должна уже вывести два шага (первый и второй). Потом точно также первый, второй и третий и т. д., пока не выведутся все шаги. Проблема в том, что setTimeout срабатывает только один раз, то есть у меня выводится сначала первый шаг деления, потом через полсекунды первый и второй, а затем процесс останавливается и в строке состояния появляется надпись "Ошибка на странице". Помогите, пожалуйста, разобраться! Заранее спасибо. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 44 Всего: 315 |
вот только что же обсуждалось http://forum.vingrad.ru/forum/topic-230239.html
|
|||
|
||||
| Dima 2015 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: нет Всего: 2 |
Newss, не вникал особо, но обычно это вот так должно работать, если надо параметр в Сеттайм передать:
setTimeout('vyvod(' + i + ')',500) |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 44 Всего: 315 |
||||
|
||||
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Меня интересует именно вопрос, почему setTimeout выполняется только один раз и как это исправить. В принципе, код работает, но только однократно(( |
|||
|
||||
| Michael.de |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
Newss, ошибка появляется, когда происходит деление 5 на 2 (строка 1, позиция 1: переменная i не определена). Из-за этих бесконечных document.write() весь исходный текст пишется в одну строку, что не есть гут при поиске ошибки
P.S. Для улучшения читабельности я бы кое-что поменял: 1. вместо i=i+1 пиши i++ 2. в конце каждого выражения ставь ";" 3. for (n=1;n<=5;n=n+1) {document.write(" ")} - без комментариев и т.д. Это сообщение отредактировал(а) Michael.de - 3.10.2008, 15:28 |
|||
|
||||
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Переменную i я объявил перед вызовом функции count, оно у меня изначально = 0. Проблема не в этом. Функция count все считает правильно, я проверял: если убрать setTimeout, то все выводится до конца и правильно. А с setTimeout только первые два шага... |
|||
|
||||
| Michael.de |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
Newss: кстати, ты знаешь разницу между ф-циями setTimeout() и setInterval() ? Для твоей задачи подходит больше вторая... или используй цикл
Это сообщение отредактировал(а) Michael.de - 3.10.2008, 16:12 |
|||
|
||||
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Цикл пробовал использовать - все равно не работает. Честно говоря, про setInterval() не знаю. Можно поподробнее? |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 44 Всего: 315 |
интервал, тоже что и таймаут. задаётся также. но ты его запускаешь один раз, и он выполняется всегда. или до тех пор пока его не остановишь
|
|||
|
||||
| Michael.de |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
bars80080: распишу поподробнее, если не возражаешь
Newss: использовать можно так:
или так:
P.S. исправил очепятку Это сообщение отредактировал(а) Michael.de - 6.10.2008, 21:44 |
||||
|
|||||
| Michael.de |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
Newss: если хочешь, можешь воспользоваться более универсальным кодом (багов я не нашёл) :
|
|||
|
||||
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Michael.de: Спасибо большое, код работает. Вот только фишка как раз в том, что нужна визуализация, то есть нужно показывать поэтапно ход вычислений, и непременно с задержками (таково желание препода). Вот именно в этим у меня и зависание уже второй месяц...((((
Попробовал использовать SetInterval - все равно не работает. Происходит задержка на то время, которое я указываю в методе, а затем сразу выводится ответ, то есть ход вычислений скрипт вообще не показывает на экране. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 44 Всего: 315 |
значит код надо делить на функции, а запуск следующего участка по выполнению какого-нибудь действия пользователя, скажем кнопки
кстати, программа может прерываться на выдачу диалоговых окон (alert, confirm, prompt), второе из них вполне можно использовать для выдачи промежуточного результата и спрашивания: продолжать ли дальше? |
|||
|
||||
| Michael.de |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
Newss: В тело setInterval() "пихается" элементарное действие, а не вся ф-ция. Т.е. в твоём случае, всё связанное с однократным деление на 2:
P.S. document.write() - очень плохой стиль (imho) - код невозможно читать P.P.S. исправил очепятку Это сообщение отредактировал(а) Michael.de - 6.10.2008, 21:45 |
||||
|
|||||
| Michael.de |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 22.3.2005 Где: Deutschland Репутация: 4 Всего: 9 |
Newss: вот тебе пример использования setInterval() с моим предыдущим примером:
P.S. Заменил в строчках 34 и 40 innerHTML на value, т.к. в IE глючит Это сообщение отредактировал(а) Michael.de - 6.10.2008, 23:02 |
|||
|
||||
| Newss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 3.10.2008 Репутация: нет Всего: нет |
Спасибо, попробую ещё раз setInterval помучить
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |