Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
7 / 2 / 0
Регистрация: 17.11.2009
Сообщений: 116
1

setInterval работает неправильно!

18.10.2011, 14:27. Показов 2217. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сдравствуйте!Решил поправтиковаться и написать программу которая должна создавать падающие снежинки на экране, вот код:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
window.onload  = function()
{   
    var img;
    img  = document.createElement('img');
    img.src = '1.jpg';
    var arr  = new Array(); 
    function Place(arr)
    {
        for(var i = 0;i<15;i++)
        {   
            arr.push(img.cloneNode());
            arr[i].style.marginLeft = Math.random()*1000+'px';
            document.body.appendChild(arr[i]);
        }
    }
    Place(arr);
    function DownFall(mas)
    {
        for(var j = 0;j<mas.length;j++)
        {
            mas[j].style.marginTop += 20+'px';
            document.body.appendChild(mas[j]);
        }
    }
    setInterval(DownFall,200,arr);
}
Но вот в чем проблема, функция которая засунута в setInterval выполняеться только 1 раз, в чем причина не могу понять, возможно вы мне подскажите, заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2011, 14:27
Ответы с готовыми решениями:

Не работает setInterval
Здравствуйте var idb; var asd = 0; $(&quot;.button&quot;).mouseenter(function() { idb = ...

Не работает setInterval();
Подскажите, пожалуйста, почему код не перезапускается каждые 300 мс? &lt;title&gt;DOM...

не работает setInterval
Выдает Uncaught SyntaxError: Unexpected identifier подскажите что не так var timer =...

setInterval не работает
Ну почему этот маленький зелёненький квадратик не хочет опускаться в низ? Я уже головой об стенку...

3
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
18.10.2011, 15:09 2
setInterval нормально выполняется, просто ваша функция не фунциклирует. Вставьте туда алерт что ли для проверки. Вы прибавляете значение к строке и сверху ещё намазываете "px" (строка 21 вашего листинга). Попробуйте вычленить числовую часть. Как-то так, например:
Javascript
1
2
3
var element;
element=mas[j].style.marginTop
mas[j].style.marginTop=Number(element.substr(0,element.length-2))+20+'px';
1
7 / 2 / 0
Регистрация: 17.11.2009
Сообщений: 116
18.10.2011, 15:13  [ТС] 3
Спасибо, я понял в чем была ошибка!
0
front-end developer
284 / 275 / 39
Регистрация: 31.08.2010
Сообщений: 577
Записей в блоге: 1
19.10.2011, 01:59 4
Цитата Сообщение от BART Посмотреть сообщение
Спасибо, я понял в чем была ошибка!
И в чем же? Лично я Ваш код проверил и нашел в нем три ошибки.

Во-первых:
Opera, Netscape Navigator и FireFox требуют наличия параметра в методе cloneNode():
- cloneNode(булево значение)
булево значение - это значение управляет тем, включает ли копия узла все дочерние узлы исходного (true) или нет (false).

В нашем случае нужно вызывать метод с параметром false:
arr.push(img.cloneNode(false));

Во-вторых:
Как уже было сказано выше строка:
Javascript
1
mas[j].style.marginTop += 20+'px';
Вызовет ошибку, т.к. будет содержать в себе строковое значение, к примеру, изначально свойство:
Javascript
1
mas[j].style.marginTop
будет иметь значение пустой строки - '', а операция:

Javascript
1
mas[j].style.marginTop += 20+'px';
эквивалентна пустая строка + 20 + 'px' и равна строке '20px', при втором присваивании будет уже ошибка:

Javascript
1
mas[j].style.marginTop += 20+'px';
эквивалентна '20px' + 20 + 'px' и равна строке '20px20px'

Поэтому строку:

Javascript
1
mas[j].style.marginTop += 20+'px';
заменяем на:

Javascript
1
mas[j].style.marginTop = parseInt(mas[j].style.marginTop)+ 20+'px';
А в функцию Place добавляем строку:
Javascript
1
arr[i].style.marginTop = 0;
Т.к. функция parseInt трансформирующая строку в число, при получении пустой строки вернет не 0 а значение NaN(Not a Number), что приведет к ошибке, а так изначально свойству marginTop мы присвоили значение 0 (в функции Place).

В-третьих:

Это строка будет работать во всех браузерах, кроме IE:
Javascript
1
setInterval(DownFall,200,arr);
Т.к. третий параметр не поддерживается IE.

Заменяем строку:
Javascript
1
setInterval(DownFall,200,arr);
На:
Javascript
1
setInterval(function(){DownFall(arr);},200);
В-четвертых: Передавать arr функции Place - лишнее, функция Place и без этого имеет доступ к переменной arr.

И получаем кроссбраузерный и работающий код:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 window.onload  = function()
{   
   var img;
   img  = document.createElement('img');
   img.src = '1.jpg';
   var arr  = new Array(); 
 
   function Place()
   {
      for(var i=0; i<15; i++)
      {       
          arr.push(img.cloneNode(false));
          arr[i].style.marginLeft = Math.random()*1000+'px';
          arr[i].style.marginTop = 0;
          document.body.appendChild(arr[i]);
       }
   }
   Place();          
            
   function DownFall(mas)
   {
       for(var j=0; j<mas.length; j++)
       {
            mas[j].style.marginTop = parseInt(mas[j].style.marginTop)+ 20+'px';
            document.body.appendChild(mas[j]);
        }
                        
     }
     setInterval(function(){DownFall(arr);},200);
}
0
19.10.2011, 01:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2011, 01:59
Помогаю со студенческими работами здесь

Без setInterval не работает
Привет всем! Продолжаю изучать JS. У меня назрел вот такой вопрос. Почему такой код отлично...

Почему медленно работает setInterval?
Делаю движение картинки влево-вправо (меняю left с 30px на 10px, потом обратно). подскажите,...

Как работает циклический вызов setInterval?
Все доброго дня. Подскажите как работает циклический вызов setInterval? Меня интересует момент:...

SetInterval в IE работает только при открытой консоли
Доброго времени суток, уважаемы коллеги. Подскажите, почему так может происходить? Создал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru