Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   о этот setTimeout x_x (https://javascript.ru/forum/events/30248-o-ehtot-settimeout-x_x.html)

Romeo 28.07.2012 23:53

о этот setTimeout x_x
 
Доброго времени суток уважаемые форумчане!
Вот уже как день мучаюсь с этой триклятой функцией!
Имеется такой код(сокращённо):
response=response-0;
obj_p1=document.getElementById('l1'+idCell); 
obj_p2=document.getElementById('l2'+idCell); 
 while (response>=idCell) {
       i2=1;
       sl=parseInt(obj_p1.style.left);
       function rist() { 
       obj_p1.style.left=sl+i2+'px';
       obj_p2.style.left=sl+i2+'px';
       i2=i2+2;
       if (i2 < 300) {
       setTimeout(rist,0);
       } }
       rist(); 
  idCell++;
  obj_p1=document.getElementById('l1'+idCell); 
  obj_p2=document.getElementById('l2'+idCell); 
}

Ну и естественно setTimeout проходит только один раз, второй оборот цикла уже не выполняется! Уверен на 90% что всё дело в синтаксисе, но промучавшись 2 дня с всевозможными комбинациями '," и + ни к чему не пришёл! Прошу помочь, спасибо.

PS: До этого имел дело с этой функцией, и пока не привёл строчку к виду ниже, так же выполнялся прогон только один раз. Но тут вызов рекурсивный, и как это всё оформить просто не представляю(((
setTimeout("if (document.getElementById('"+trList2[i].id+"')) document.getElementById('"+trList2[i].id+"').style.display='none'",3000);

Deff 29.07.2012 00:02

Romeo, Попробуйте так запустить
var Cicl=0;
response=response-0;
obj_p1=document.getElementById('l1'+idCell); 
obj_p2=document.getElementById('l2'+idCell);

 while (response>=idCell) {
       i2=1;
       sl=parseInt(obj_p1.style.left);
       function rist() { 
       obj_p1.style.left=sl+i2+'px';
       obj_p2.style.left=sl+i2+'px';
       i2=i2+2;
       if (i2 < 300) {Cicl++;
             if(Cicl%100==0){alert('ещё сотня  i2='+i2)}
             setTimeout(rist,0); 
       }}
       rist(); 
  idCell++;
  obj_p1=document.getElementById('l1'+idCell); 
  obj_p2=document.getElementById('l2'+idCell); 
}

Romeo 29.07.2012 00:27

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

Deff 29.07.2012 00:37

Romeo,
1. Выньте всю внутренность функции
Поставьте alert внутрь - вызов то есть ? (Мож до него и не доходит - портицо раньше

Romeo 29.07.2012 12:04

дак я же сказал что одна итерация только проходит.
я привёл в PS пример строчки. Пока кавычки не расставил как там, тоже, один раз только функция выполнялась, тоже кстати вызывалась из цикла.

Deff 29.07.2012 13:42

Цитата:

Сообщение от Romeo
а в чём суть изменений? они же никак не влияют на ход выполнения функции.
Говорю же, дело в синтаксисе...

Попробуйте передавать в функцию все используемые параметры *вызов через timeOut отвязан от текущих значений, в родительской функции

bes 29.07.2012 15:56

Здесь экстрасенсов мало, приведите нормальное описание того, что хотите получить в итоге и полный пример (по сути проблемы), на котором можно будет испытать.
PS: сразу можно сказать, что объявлять в цикле функцию не есть гуд

Romeo 29.07.2012 19:40

Цитата:

Сообщение от bes (Сообщение 192677)
Здесь экстрасенсов мало, приведите нормальное описание того, что хотите получить в итоге и полный пример (по сути проблемы), на котором можно будет испытать.
PS: сразу можно сказать, что объявлять в цикле функцию не есть гуд

нужно чтобы дивы одновременно вправо перемещались.
ну а как по другому сделать, если не есть гуд? никак... нужно просто расставить правильно кавычки.

Цитата:

Сообщение от Deff (Сообщение 192661)
Попробуйте передавать в функцию все используемые параметры *вызов через timeOut отвязан от текущих значений, в родительской функции

пробывал, не помогло.

bes 29.07.2012 19:57

Цитата:

Сообщение от Romeo
нужно чтобы дивы одновременно вправо перемещались.
ну а как по другому сделать, если не есть гуд? никак... нужно просто расставить правильно кавычки.

уже лучше, посмотрите http://javascript.ru/forum/events/29...tml#post185351, там меняется width, сделайте тоже самое с left

Romeo 30.07.2012 22:43

Вложений: 1
Цитата:

Сообщение от bes (Сообщение 192726)
уже лучше, посмотрите http://javascript.ru/forum/events/29...tml#post185351, там меняется width, сделайте тоже самое с left

у меня в цикле идёт перебор дивов.
вот полный код и скриншот. При клике на стрелочку "вправо", все дивы что справа и включая этот див сдвигаются вправо.
Каждый столбец разбит на 2 дива, вверхний(l1) и нижний (l2).
function linesdvig(idCell) //передаётся номер столбца
{ 
new Ajax.Request('sdvig.php', { //кол-во столбцов +1
  parameters: {pam:2},
  onSuccess: function(transport){
  var response = transport.responseText || "ничего не передано"; //возвращается сколько столбцов всего
  response=response-0;
newline(idCell); //здесь рисует стрелочка t
obj_p1=document.getElementById('l1'+idCell); 
obj_p2=document.getElementById('l2'+idCell); 

 while (response>=idCell) {
       i2=1;
       sl=parseInt(obj_p1.style.left);
       function rist() { 
       obj_p1.style.left=sl+i2+'px';
       obj_p2.style.left=sl+i2+'px';
       i2=i2+2;
       if (i2 < 300) {setTimeout(rist,0);
       } }
       rist(); 
    linepos=idCell+1;
    obj_p1.id = "l1"+linepos;
    obj_p1.setAttribute('onmouseout','javascript: nodisp(id)');
    obj_p1.setAttribute('onmouseover','javascript: disp(id)');
    var newimg1=document.createElement('img');
    newimg1.setAttribute('move_this', false);
    newimg1.style.display="none";
    newimg1.style.position="absolute";
    newimg1.style.bottom='-3px';
    newimg1.title="Удалить линию";
    newimg1.style.right='0px';
    newimg1.src='image/del.png';
    newimg1.setAttribute('onclick','javascript: closeline('+linepos+')');
    newimg1.setAttribute('onmouseout','javascript: onsetimgl('+linepos+')');
    newimg1.setAttribute('onmouseover','javascript: setimgl('+linepos+')');
    newimg1.id='imgl'+linepos;
    var newimg2=document.createElement('img');
    newimg2.setAttribute('move_this', false);
    newimg2.style.display="none";
    newimg2.style.position="absolute";
    newimg2.style.bottom='-3px';
    newimg2.style.left='60px';
    newimg2.title="Добавить новый блок на "+linepos+" линию";
    newimg2.src='image/add.png';
    newimg2.setAttribute('onclick','javascript: setupMessageButton('+linepos+')');
    newimg2.setAttribute('onmouseout','javascript: onsetimga('+linepos+')');
    newimg2.setAttribute('onmouseover','javascript: setimga('+linepos+')');
    newimg2.id='imga'+linepos;
    var newimg3=document.createElement('img');
    newimg3.setAttribute('move_this', false);
    newimg3.style.display="none";
    newimg3.style.position="absolute";
    newimg3.style.bottom='-3px';
    newimg3.style.left='80px';
    newimg3.title="Добавить новую линию на "+linepos+" позицию";
    newimg3.src='image/sdvig.png';
    newimg3.setAttribute('onclick','javascript: linesdvig('+linepos+')');
    newimg3.setAttribute('onmouseout','javascript: onsetimgs('+linepos+')');
    newimg3.setAttribute('onmouseover','javascript: setimgs('+linepos+')');
    newimg3.id='imgs'+linepos;
    var text = '<br>&nbspдень '+linepos;
    obj_p1.innerHTML=text;
    obj_p1.appendChild(newimg1);
    obj_p1.appendChild(newimg2);
    obj_p1.appendChild(newimg3);
    obj_p2.setAttribute('name',linepos);
    obj_p2.id = "l2"+linepos;
 idCell++;
  obj_p1=document.getElementById('l1'+idCell); 
  obj_p2=document.getElementById('l2'+idCell); 
}
    },
    onFailure: function(){ alert('Что-то пошло не так...') },
      });
}

PS:
C вложением вообще беда... почему то сжимает картинку, хотя по разрешенным параметрам ничего не нарушается.


Часовой пояс GMT +3, время: 13:51.