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 вложением вообще беда... почему то сжимает картинку, хотя по разрешенным параметрам ничего не нарушается.

bes 30.07.2012 23:24

Да, скриншот мелковат, так получается чего или нет? Посоветованный пример посмотрели?
PS: javascript: в обработчиках уже устарело, поэтому не нужно
функцию rist вынести за пределы цикла

bes 30.07.2012 23:37

<style>
	div {
		border: solid 1px;
		width: 50px;
		height: 50px;
	}
</style>

<div id="div" style="position: absolute; top: 0px; left: 0px; border: none; ">
	<button>click</button>
	<div>div1</div>
	<div>div2</div>
	<div>div3</div>
</div>

<script>
window.onload = function () {
	var div = document.getElementById('div');
	var but = div.children[0];
	
	but.onclick = function () {
		var count = 200;
		var step = 6;
		var coof = 1;
		var goLeft = function (elem) {
			elem.style.left = parseInt(elem.style.left) + step;
		}
		for (var i = 0; i < count; i += step) {
			setTimeout(function () {goLeft(div)}, i*coof);
		}
	}
  
}
</script>

Romeo 04.08.2012 16:18

причём тут это? Ваш код передвигает весь родителський див с потомками, а не набор определённых дивов внутри...
не то всё это(

vadim5june 04.08.2012 17:16

Цитата:

Сообщение от Romeo
тут вызов рекурсивный

нет у Вас рекурсивного вызова и правильно один раз выполняется
если бы вместо setTimeout(rist,0); написали бы rist()- была бы рекурсия

Romeo 04.08.2012 23:09

Цитата:

Сообщение от vadim5june (Сообщение 194573)
нет у Вас рекурсивного вызова и правильно один раз выполняется
если бы вместо setTimeout(rist,0); написали бы rist()- была бы рекурсия

аналогичные выражения. включал счётчик, проверял.

Deff 04.08.2012 23:19

Romeo,
Длинный код - жарко - лучше дебажить или с готовой странички или минималистический код с HTML работающий в топике и демонстрирующий проблему...

Просто подобная задача была вчера - полторы штуки - а тут бесплатно и напрягайся,

bes 05.08.2012 10:07

Цитата:

Сообщение от Romeo
причём тут это? Ваш код передвигает весь родителський див с потомками, а не набор определённых дивов внутри...
не то всё это(

В чём проблема доработать код функции goLeft (которую логичнее было бы назвать goRight), и перемещать необходимые вам элементы, я лишь показал пример как это можно сделать (в том числе, не объявляя в цикле функцию, её вообще можно вынести за пределы обработчика onclick) или вам нужен готовый скрипт с нуля?

Romeo 05.08.2012 18:49

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

Romeo 05.08.2012 19:52

вот, сделал :)
Всем огромное спасибо, и отдельно Бесу за пример скрипта который я переделал)
<style>
	div div {
		border: solid 1px;
		width: 50px;
		height: 50px;
	}
</style>

<div style="position: relative; top: 0px; left: 0px;">
	<div onclick="qwe(id)" style="position: absolute; top: 0px; left: 0px;" id="1">div1</div>
	<div onclick="qwe(id)" style="position: absolute; top: 50px; left: 0px;" id="2">div2</div>
	<div onclick="qwe(id)" style="position: absolute; top: 100px; left: 0px;" id="3">div3</div>
        <div onclick="qwe(id)" style="position: absolute; top: 150px; left: 0px;" id="4">div4</div>
</div>

<script>

function qwe(id)
{
var count = 200;
var step = 6;
var coof = 1;
for (var j = id; j < 5; j++) {
     for (var i = 0; i < count; i += step) {
      setTimeout("document.getElementById('"+j+"').style.left = parseInt(document.getElementById('"+j+"').style.left) + parseInt('"+step+"')",i*step);
	}
	}
}
</script>

bes 05.08.2012 21:51

Можно так (хотя при быстрых кликах не будет точности)

<style>
	#div div {
		position: absolute;
		border: solid 1px;
		width: 50px;
		height: 50px;
	}
</style>

<div id="div">
	<div style="left: 0px; top: 0px">div1</div>
	<div style="left: 0px; top: 50px;">div2</div>
	<div style="left: 0px; top: 100px;">div3</div>
	<div style="left: 0px; top: 150px">div4</div>
</div>

<script>
window.onload = function () {
	var div = document.getElementById('div');
	var divs = div.children;
	var len = divs.length;
	var count = 200;
	var step = 6;
	var coof = 1;
	var mas;
	
	function goRight(mas) {
		var len = mas.length;
		for (var i = 0; i < len; i++) {
			mas[i].style.left = parseInt(mas[i].style.left) + step;
		}
	}

	div.onclick = function (e) {
		e = e || event;
		var target = e.target || e.srcElement;
		mas = [];
		for (var i = 0; i < len; i++) {
			if (target == divs[i]) {
				for (var j = i; j < len; j++) {
					mas.push(divs[j]);
				}
				break;
			}
		}
		for (var i = 0; i < count; i += step) {
			setTimeout(function () {goRight(mas)}, i*step);
		}
	}
	
}
</script>

Romeo 06.08.2012 01:54

ну, я же не только дивы буду перемещать, там канвасы ещё перерисоватывать, и прочее... для моей задачи решение всё же первое больше подходит... да и попроще оно вроде)))

bes 06.08.2012 09:57

Цитата:

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

Там, где много элементов и завязано на клик, лучше использовать target, не нужно задавать id перемещаемым элементам (которые в принципе не рекомендуется начинать с цифры, хотя и так работает) + основной код задаётся в функции, а не в setTimeout, задача только заполнить массив элементов, которые будут участвовать в процессе.

Romeo 06.08.2012 12:31

я потом дам ссылку на готовый проект)
там просто к БД привязка ещё идёт, так что id необходимы)


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