Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблема с setInterval и if..else

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Скрипт работает некореткно, ткните носом в проблему
eko24
Отправлено: 02 Октября, 2013 - 00:44:56
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Есть такой хтмл
CODE (html):
скопировать код в буфер обмена
  1. <span id="c1">C1:<span class="green">0</span><span class="gray">0</span><span class="red">0</span></span><br>


И с ним взаимойдействует такой JS:
CODE (javascript):
скопировать код в буфер обмена
  1. <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
  2. <script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
  3.                
  4. <script type="text/javascript">
  5. $(document).ready(function()
  6. {      
  7.        
  8.        
  9.         function inc()
  10.         {
  11.        
  12.                 var cgre = $(".green").html();
  13.                 var cgra = $(".gray").html();
  14.                 var cre = $(".red").html();
  15.                 var light = 'green';
  16.                
  17.                
  18.                 if(light == 'green'){
  19.         if(cgre==5)
  20.                 {
  21.                         light = 'gray';
  22.                         f = 'g';
  23.                         cgre = 0;
  24.                         $(".green").html(cgre);
  25.                 }
  26.         else
  27.                 {
  28.                         cgre++;
  29.                         $(".green").html(cgre);
  30.                 }
  31.         }
  32.                  
  33. if(light == 'red'){
  34.         if(cre==5)
  35.                 {
  36.                         light = 'gray';
  37.                         f = 'r';
  38.                         cre = 0;
  39.                         $(".red").html(cre);
  40.                 }
  41.         else
  42.                 {
  43.                         cre++;
  44.                         $(".red").html(cre);
  45.                 }
  46.         }
  47.                  
  48. if(light == 'gray'){
  49.         if(cgra==3)
  50.                 {
  51.                         if(f=='g')
  52.                                 {
  53.                                         light = 'red';
  54.                                 }
  55.                         else
  56.                                 {
  57.                                         light = 'green';
  58.                                 }
  59.                         cgra = 0;
  60.                         $(".gray").html(cgra);
  61.                 }
  62.         else
  63.                 {
  64.                         cgra++;
  65.                         $(".gray").html(cgra);
  66.                 }
  67.  
  68.         }
  69. }
  70.  
  71. setInterval(function(){inc()},1000);
  72. });
  73. </script>


Что этот скрипт должен делать:
1)Увеличивать переменную cgre пока она не будет равна 5
2)Когда переменная cgre станет равна 5 скрипт должен перейти к блоку if(light == 'gray') вместе с переменной f, значение которой "g"
3)Блок if(light == 'gray') увеличивает переменную cgra пока она не станет равна 3
4)Когда она стала равна 3, скрипт должен перейти к блоку if(light == 'red') или if(light == 'green') в зависимости от значения переменной f (в данном случае значение "g")
6)Скрипт переходит к блоку if(light == 'red') и увеличивает переменную cre пока она не будет равна 5
7)Когда переменная cre станет равна 5 скрипт должен перейти к блоку if(light == 'gray') вместе с переменной f, значение которой "r"

Но данный код делает следующее:
1)Увеличивает переменную cgre пока она не будет равна 5
2)Переходит к блоку if(light == 'gray') вместе с переменной f, значение которой "g"
3)Увеличивает переменную cgre на 1
4)Переходит к блоку if(light == 'green') и все начинается заново

Ткните носом пожалуйста в ошибку.
Побробовал объяснить попроще с помощью картинки:
Прикреплено изображение (Нажмите для увеличения)
Безымянный.png

(Отредактировано автором: 02 Октября, 2013 - 00:45:50)

 
 Top
IllusionMH
Отправлено: 02 Октября, 2013 - 04:57:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




eko24, var light = 'green'; в теле функции при каждой итерации.
вынесите объявление переменных перед функцией, они буду видны в замыкании, и не придется их каждый раз их считывать из документа.

CODE (javascript):
скопировать код в буфер обмена
  1. setInterval(function(){inc()},1000);

=
CODE (javascript):
скопировать код в буфер обмена
  1. setInterval(inc,1000);


upd. Убрал лишние скобки, как указали ниже.

(Отредактировано автором: 02 Октября, 2013 - 12:56:29)

 
 Top
eko24
Отправлено: 02 Октября, 2013 - 10:26:48
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




И снова вы меня выручаете Радость
Спасибо большое !
 
 Top
esterio
Отправлено: 02 Октября, 2013 - 12:23:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH
IllusionMH пишет:

setInterval(function(){inc()},1000);
=
setInterval(inc(),1000);


емм а почему ети две конструкции равнозначны? разве во втором случае не будет визвана inc всего одни раз
 
 Top
IllusionMH
Отправлено: 02 Октября, 2013 - 12:56:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




esterio, балин. Забыл еще и скобки удалить. Писал под утро после ночи фикса багов перед релизом Ниндзя
Пофиксил.
 
 Top
esterio
Отправлено: 02 Октября, 2013 - 13:07:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)





IllusionMH
бывает
 
 Top
eko24
Отправлено: 02 Октября, 2013 - 19:54:12
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




IllusionMH пишет:
var light = 'green'; в теле функции при каждой итерации.

Не совсем Вас понял куда именно это нужно вставить, потому что в теле функции оно и так стоит:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. function inc()
  3. {
  4.  var cgre = $(".green").html();
  5. var cgra = $(".gray").html();
  6. var cre = $(".red").html();
  7. var light = 'green';
  8.  

И не совсем понимаю, что вы имеете ввиду под итерацией: блок разветвления ?
 
 Top
IllusionMH
Отправлено: 02 Октября, 2013 - 20:46:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




eko24 пишет:
потому что в теле функции оно и так стоит:

eko24, а я говорю - вынести его вне тела функции. Написать выше.
IllusionMH пишет:
вынесите объявление переменных перед функцией

итерация
 
 Top
eko24
Отправлено: 02 Октября, 2013 - 21:21:42
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Были бы у меня деньги - поставил бы вам памятник Закатив глазки
 
 Top
nerv
Отправлено: 02 Октября, 2013 - 23:30:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




eko24 пишет:
Были бы у меня деньги - поставил бы вам памятник

ах как хочется мне в бронзе вас отлить Улыбка


-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB