Jump to content
  • 0

setTimeout


moron
 Share

Question

Нахожусь вначале своего пути освоения жс. Я захотел сделать простой малюсенький скрипт, который менял бы цвет дива с некой задержкой времени.

Код очень простой, но он почему то не работает: http://jsfiddle.net/Sc57E/ . Я пытался разобраться сам: читал синтаксис этого метода таймоут, выводил отдельно алертом кусочки скрипта...ничо у меня не вышло. В чем ошибка?

Edited by moron
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

Но задача была совсем другая : вы повесили на клик смену на рандомный цвет с задержкой. Моей целью было упорядоченная смена цвета квадрата, на цвета из массива. Т.е любое событие и квадрат меняет свой цвет: сначало на желтый, зеленый, красный с интервалом в определенное время, главное чтобы это было заметно человеческому глазу, а у меня получается так, что смена очень быстрая и просто не успеваем заметить других цветов, кроме последнего - черного . Задержки не получается, а тут я вовсе где-то прочитал, что в жс и вовсе таймеров никаких нет, а таймоут и интервал ничего не держат, а просто повторяют сами себя и какой-то поток идет дальше ( О_о ) .Но каждый пример с моими знаниями полезен - cпасибо.

Чучуть изменил http://jsfiddle.net/Sc57E/8/

Edited by moron
Link to comment
Share on other sites

  • 0

Одно событие меняет цвет на квадрате несколько раз постепенно из массива с неким интервалом. За меня не надо писать скрипт, мне надо объяснить почему не работает мой.

Из Вашего кода ничего не понятно.

И не понятно, а что именно? как писать лучше?

Edited by moron
Link to comment
Share on other sites

  • 0
За меня не надо писать скрипт, мне надо объяснить почему не работает мой.

а почему он должен работать? ) Предлагаю Вам написать к нему комментарии и выложить его сюда.

Link to comment
Share on other sites

  • 0

Твоя ошибка - думать, что когда цикл дойдет до таймера, он остановится и подождет его выполнения, а затем возобновится. На самом деле, функции setTimeout и setInterval откладывают выполнение только того действия или функции, которая указана в скобках. Получается, каждая итерация цикла запускала таймер заново, а таймер, при запуске, запускал действие и свою попытку "подождать", что у него и не получалось.

Правильно сделать вот так

http://jsfiddle.net/CJ2Yf/

Link to comment
Share on other sites

  • 0
Правильно сделать вот так

var myArray = new Array ("yellow", "green", "red", "blue", "black");
function changeColor(id){
var i=0;
var interval = setInterval(function() {
document.getElementById(id).style.backgroundColor=myArray[i++];
if(i >= myArray.length) clearInterval(interval);
}, 1000);
}
changeColor('ololo');

ну-ну. Сколько раз вызывается таймер, столько ищется элемент по id.

moron,

1. избыточность в именах переменных (myArray/myColor). Зачем mу? Ну твои, они, твои, чьи же еще )

2. document.getElementById(rainbow).style.backgroundColor=myColor; - это я уже комментировал, смотри выше

3. все значения цветастого массива - массива цветов

4. //объявляем перменную муКолор, в которую будут постепенно записаны все переменные из массива - неверное трактование. В переменную будут поочередно записываться строки из массива.

5. про создание массива с помощью конструктора молчу...

6. еще не есть гуд писать функцию прямо в таймер, но для примера сойдет

Edited by nerv
Link to comment
Share on other sites

  • 0
6. еще не есть гуд писать функцию прямо в таймер, но для примера сойдет

Извиняюсь за офтопик... А если function используется для передачи параметров функции, вызываемой по таймеру? Я использую такую запись:

setInterval(function(){doSomething(arg1,arg2)},5000)

Link to comment
Share on other sites

  • 0

NeoXidizer, так я там все написал ) Если уж говорите, что "так правильно", то делайте правильно все )

hedgehog, правильно заметили. Я выразился не совсем точно. Использовать обертку (как в Вашем случае) вполне допустимо (скорее необходимо), а вот писать "многокода" прямо в таймер, все-таки не стоит (на мой взгляд).

Link to comment
Share on other sites

  • 0

NeoXidizer, так я там все написал ) Если уж говорите, что "так правильно", то делайте правильно все )

это глупый перфекционизм, который мешает лишь разработчику. У автора не работал его код, я его переписал, показав, как правильно в его случае применить таймер

темболее, вызывать другую функцию с одной строчкой кода будет гораздо "дороже", чем написать эту самую строчку внутри таймера, как это сделал я

Link to comment
Share on other sites

  • 0

>чем написать эту самую строчку внутри таймера, как это сделал я

на этот счет я ответил выше

>это глупый перфекционизм, который мешает лишь разработчику

если человек хочет называться (js-)разработчиком, он должен стремиться к полному контролю над кодом (и как следствие производительностью). Считаете, что это глупо? Пожалуйста, это Ваше мнение.

p.s.: себя я js-разработчиком не считаю :)

Edited by nerv
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy