Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.03.2018, 07:41
Аспирант
Отправить личное сообщение для Самовар Посмотреть профиль Найти все сообщения от Самовар
 
Регистрация: 28.03.2017
Сообщений: 31

непонятное поведение InnerHTML
Дело вот в чем. Есть конструктор Tank, который в зависимоит от переданного параметра name создает два вида танков (Т34 и Тигр). Тигр выступает в качестве мишени, который Т34 расстреливает. При нажатии на кнопку "Атаковать" запускается цикл while, в котором пока Тигр не будет уничтожен танк Т34 ведет по нему огонь. Очки прочности Тигра отображаются в элементе div, который расположен рядом с картинкой Тигра. Вот функция атаки танка

Tank.prototype.attack = function(target) {
 if (target == Tiger){
    target.hp = target.hp - this.damage;
  tooltipElemTiger.innerHTML = target.hp;
  alert(this.name + " атаковал " + target.name);
  alert("Очков прочности " + target.name + target.hp + " единиц");
  if (target.hp <= 0) this.destroyed(target);}
};


По идее после каждого выстрела параметр InnerHTML должен обновляться и отображать количество оставшихся единиц прочности танка. НО он обновляется только ПОСЛЕ того, как Тигр уничтожен, а не после каждого выстрела. Сломал всю голову но так и непойму проблемы. Если в функции battle убрать цикл и просто несколько раз прописать функцию атаки, то всё работает корректно (див обновляет оставшуюся прочность после каждого выстрела). Значит проблема именно в циклическом выполнении функции.

Вот ссылка на кодпен, чтобы наглядно всё было видно. Не обращайте внимания, что не всё ровно, пока интересует только функциональная часть. https://codepen.io/Sergeev2/pen/qxLXzB
Ответить с цитированием
  #2 (permalink)  
Старый 21.03.2018, 08:04
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
document.body.style.backgroundColor = "red";
alert();
	</script>
</body>
</html>

Известная проблема
Ответить с цитированием
  #3 (permalink)  
Старый 21.03.2018, 08:07
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Вместо while рекурсивный setTimeout и все заработает
Ответить с цитированием
  #4 (permalink)  
Старый 21.03.2018, 08:19
Аспирант
Отправить личное сообщение для Самовар Посмотреть профиль Найти все сообщения от Самовар
 
Регистрация: 28.03.2017
Сообщений: 31

А с чем связана такая непонятная работа скрипта? По идее команды должны выполняться одна за другой, а не как попало
Ответить с цитированием
  #5 (permalink)  
Старый 21.03.2018, 08:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,209

Сообщение от Самовар
По идее команды должны выполняться одна за другой
Они так и выполняются.
Ответить с цитированием
  #6 (permalink)  
Старый 21.03.2018, 08:24
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Самовар,
Это не какая то ошибка языка, интерпретатор так настроен у хрома и браузеров сделанных на его основе.
Ответить с цитированием
  #7 (permalink)  
Старый 21.03.2018, 08:24
Аспирант
Отправить личное сообщение для Самовар Посмотреть профиль Найти все сообщения от Самовар
 
Регистрация: 28.03.2017
Сообщений: 31

в примере Жоника, сперва вывелся алерт, а потом изменился цвет. Как-то не очень одна за другой, если я правильно понял
Ответить с цитированием
  #8 (permalink)  
Старый 21.03.2018, 08:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,209

Сообщение от Самовар
По идее после каждого выстрела параметр InnerHTML должен обновляться и отображать количество оставшихся единиц прочности танка. НО он обновляется только ПОСЛЕ того, как Тигр уничтожен, а не после каждого выстрела.
Наверное твой скрипт "крутится" в одном потоке... И пока он не завершит работу никакого "обновления" страницы ты не увидишь.
Это хорошо видно на примере j0hnik.

Тебе нужно все изменения страницы "уводить" в другой поток.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
document.body.style.backgroundColor = "red";
setTimeout(function(){
   alert();
},1);
	</script>
</body>
</html>

Последний раз редактировалось ksa, 21.03.2018 в 08:37.
Ответить с цитированием
  #9 (permalink)  
Старый 21.03.2018, 08:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,209

Сообщение от Самовар
в примере Жоника, сперва вывелся алерт, а потом изменился цвет.
Алерт обрабатывается именно так браузерами.
Ответить с цитированием
  #10 (permalink)  
Старый 21.03.2018, 08:28
Аспирант
Отправить личное сообщение для Самовар Посмотреть профиль Найти все сообщения от Самовар
 
Регистрация: 28.03.2017
Сообщений: 31

про криво работающт экплорер наслышан, но с гуглом думал всё нормально. То есть и для гугла нужно применять специфичекие приемы?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятное поведение скрипта eucalipt jQuery 15 14.10.2014 23:10
Непонятное поведение <textarea> nkl Элементы интерфейса 2 22.05.2014 14:13
Непонятное поведение - console.log Artyom Общие вопросы Javascript 19 28.11.2013 20:50
Непонятное поведение в Chrome main.c Opera, Safari и др. 3 10.10.2013 18:52
странное поведение innerhtml alexsum Общие вопросы Javascript 6 24.09.2010 16:17