28.07.2012, 23:53
|
Интересующийся
|
|
Регистрация: 24.07.2012
Сообщений: 24
|
|
о этот 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);
|
|
29.07.2012, 00:02
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
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);
}
|
|
29.07.2012, 00:27
|
Интересующийся
|
|
Регистрация: 24.07.2012
Сообщений: 24
|
|
нет, не работает...
а в чём суть изменений? они же никак не влияют на ход выполнения функции.
Говорю же, дело в синтаксисе...
|
|
29.07.2012, 00:37
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Romeo,
1. Выньте всю внутренность функции
Поставьте alert внутрь - вызов то есть ? (Мож до него и не доходит - портицо раньше
|
|
29.07.2012, 12:04
|
Интересующийся
|
|
Регистрация: 24.07.2012
Сообщений: 24
|
|
дак я же сказал что одна итерация только проходит.
я привёл в PS пример строчки. Пока кавычки не расставил как там, тоже, один раз только функция выполнялась, тоже кстати вызывалась из цикла.
|
|
29.07.2012, 13:42
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Romeo
|
а в чём суть изменений? они же никак не влияют на ход выполнения функции.
Говорю же, дело в синтаксисе...
|
Попробуйте передавать в функцию все используемые параметры *вызов через timeOut отвязан от текущих значений, в родительской функции
|
|
29.07.2012, 15:56
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Здесь экстрасенсов мало, приведите нормальное описание того, что хотите получить в итоге и полный пример (по сути проблемы), на котором можно будет испытать.
PS: сразу можно сказать, что объявлять в цикле функцию не есть гуд
|
|
29.07.2012, 19:40
|
Интересующийся
|
|
Регистрация: 24.07.2012
Сообщений: 24
|
|
Сообщение от bes
|
Здесь экстрасенсов мало, приведите нормальное описание того, что хотите получить в итоге и полный пример (по сути проблемы), на котором можно будет испытать.
PS: сразу можно сказать, что объявлять в цикле функцию не есть гуд
|
нужно чтобы дивы одновременно вправо перемещались.
ну а как по другому сделать, если не есть гуд? никак... нужно просто расставить правильно кавычки.
Сообщение от Deff
|
Попробуйте передавать в функцию все используемые параметры *вызов через timeOut отвязан от текущих значений, в родительской функции
|
пробывал, не помогло.
|
|
29.07.2012, 19:57
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от Romeo
|
нужно чтобы дивы одновременно вправо перемещались.
ну а как по другому сделать, если не есть гуд? никак... нужно просто расставить правильно кавычки.
|
уже лучше, посмотрите Плавное увеличение картинки, там меняется width, сделайте тоже самое с left
|
|
30.07.2012, 22:43
|
Интересующийся
|
|
Регистрация: 24.07.2012
Сообщений: 24
|
|
у меня в цикле идёт перебор дивов.
вот полный код и скриншот. При клике на стрелочку "вправо", все дивы что справа и включая этот див сдвигаются вправо.
Каждый столбец разбит на 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> день '+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 вложением вообще беда... почему то сжимает картинку, хотя по разрешенным параметрам ничего не нарушается.
Последний раз редактировалось Romeo, 30.07.2012 в 22:48.
|
|
|
|