Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблема с setTimeout (https://javascript.ru/forum/events/44633-problema-s-settimeout.html)

kdlinny 27.01.2014 13:36

Проблема с setTimeout
 
Здравствуйте. Есть код
< p></ p>

	var s;
	var el;
	var timeoutId;
	var pos = 0;
	var s1 = "пример выполнения скрипта";

	el = document.getElementsByTagName('p');
	s = '[';
	function writeP(posChar) {
		//alert(posChar + ' ' + s1.length);
		if (posChar < s1.length) {
			if (s1.charAt(posChar) == ' ') {
				s += '<br>';
			}
			s += s1.charAt(posChar);
		}
		else {
			clearTimeout(timeoutId);
			alert('finish');
			return;
		}
		timeoutId = setTimeout('writeP(++pos)', 500);
			
		el[0].innerHTML = s;
	}
	writeP(pos);
	el[0].innerHTML += ']';


Функция writeP выводит строку в блок абзаца, но следующая за её вызовом строка кода (последняя строка) не выполняется. Что неправильно?

ksa 27.01.2014 13:44

Цитата:

Сообщение от kdlinny
Функция writeP выводит строку в блок абзаца, но следующая за её вызовом строка кода (последняя строка) не выполняется.

С чего это ты взял? :blink:
Поставь остановку перед 26-й строкой и увидишь, что все там есть...

<p></p>
<script type="text/javascript">
	var s;
	var el;
	var timeoutId;
	var pos = 0;
	var s1 = "пример выполнения скрипта";
	el = document.getElementsByTagName('p');
	s = '[';
	function writeP(posChar) {
		//alert(posChar + ' ' + s1.length);
		if (posChar < s1.length) {
			if (s1.charAt(posChar) == ' ') {
				s += '<br>';
			}
			s += s1.charAt(posChar);
		}
		else {
			clearTimeout(timeoutId);
			alert('finish');
			return;
		}
		timeoutId = setTimeout('writeP(++pos)', 500);
		alert(s)	
		el[0].innerHTML = s;
	}
	writeP(pos);
	el[0].innerHTML += ']';
</script>

Т.ч. меняй алгоритм

kdlinny 27.01.2014 13:50

Имеется ввиду 28 строка

ksa 27.01.2014 14:12

kdlinny, ты мой пример запускал? Что получается на экране по шагам смотрел?

рони 27.01.2014 14:54

kdlinny,
строка 28 исполнится после первого шага функции writeP - браузеру же надо чем-то заниматся пока таймер тикает, на втором шаге writeP сотрёт всё что делала строка 28

kdlinny 27.01.2014 15:09

Спасибо. Всё получилось.


Часовой пояс GMT +3, время: 08:34.