Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2024, 12:57
Новичок на форуме
Отправить личное сообщение для V__K Посмотреть профиль Найти все сообщения от V__K
 
Регистрация: 28.07.2024
Сообщений: 4

Принудительно вывести содержимое кэша JavaScript
Всем здравствуйте!
Написал программу, которая должна выполнять анимацию в виде плавного смещения div'а по вертикали из позиции 100px в позицию 200px:
<style>
div#square {
	position: absolute;				
	height: 100px;
	width: 100px;
	background-color: red;
}
</style>
<input type="submit" value="Go" onclick="go()"/>
<div id="square"></div>
<script>		
function go() {			
	for(i=100;i<200;i++) {			
		document.getElementById("square").style.top = i+"px";
	}
}
</script>

Однако работает она не так, как ожидалось. Вместо плавного перемещения, div сразу прыгает в позицию 200px. По-видимому, все изменения, вносимые JavaScript-ом в документ как бы кэшируются до завершения обработчика события. Есть ли возможность принудительно выводить содержимое этого кэша до завершения обработчика? Например, какая-нибудь функция наподобие fflush в Си? Чтобы можно было написать вот так вот, и программа бы заработала:
<input type="submit" value="Go" onclick="go()"/>
<div id="square"></div>
<script>		
function go() {			
	for(i=100;i<200;i++) {			
		document.getElementById("square").style.top = i+"px";
                //Очищаем кэш и выводим его содержимое на экран
                fflush(html);
	}
}
</script>

PS: Я знаю, что такую анимацию правильнее реализовывать с помощью setTimeout. Интерес чисто технический, возможно ли в принципе заставить работать тот код, который я привёл.
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2024, 13:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,560

Нет. Цикл атомарная операция. Т.е. пока идёт цикл - ничёго больше не идёт. Вообще. Страница "зависает".
Даже если бы ты добился этого своего fflush, ты бы всё равно ничего не увидел - т.к. цикл отрабатывает моментально.

В цикле можно использовать await, который добавит задержки между итерациями, но под капотом это уже совсем не цикл, а цепочки промисов.

Анимация же нынче делается через requestAnimationFrame (который подстраивается под частоту кадров монитора) в js вместо setTimeout, и transform: translate (который считается на GPU и не влияет на разметку) в css вместо изменения позиции.
__________________
29375, 35

Последний раз редактировалось Aetae, 28.07.2024 в 13:51.
Ответить с цитированием
  #3 (permalink)  
Старый 28.07.2024, 16:14
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,134

Чем гадать и предполагать лучше научится использовать инструменты дающие точные ответы на большинство вопросов клавиша f12 и вкладка профилировщика там все действия логируются и довольно наглядно отображаются в виде графиков.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести баннер при помощи JavaScript? FRILITE Общие вопросы Javascript 4 23.03.2016 05:18
Необходимо вывести на печать содержимое окна fancybox swinrobert Общие вопросы Javascript 0 30.01.2014 16:35
Как вывести на экран содержимое тега ср1251 Общие вопросы Javascript 15 30.09.2013 20:39
Как вывести содержимое PHP файла с помощью JS? pavdin Серверные языки и технологии 6 22.12.2010 14:16
Реализация функции JavaScript, меняющей содержимое ячеек таблицы по событию onchange BOJIKOJIAK Events/DOM/Window 1 24.05.2010 05:50