Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > setTimeout и передача ссылки на объект в параметре


Автор: Иль 19.4.2005, 01:47
Скажите, я правильно понял, что в ИЕ setTimeout`у нельзя передать в параметре ссылку на объект.
Очень жаль конечно, что в Геко можно, но может я что нитак делаю.
Если не сталкивались, дам код

Автор: Sardar 19.4.2005, 02:26
Всегда давай код smile

В зависимости от приёма, например можно так:

Код
<span id="test">Test</span>
<script language="Javascript" type="text/javascript">
<!--
function changeColor(time, color) {
  var t=document.getElementById("test");
  window.setTimeout(function() {
    t.style.color=color; //здесь мы имеем доступ к контексту родительской функции, который сохранит для нас ссылку t
  }, time);
}
changeColor(3000, "red");  //через три секунды меняем цвет на красный
changeColor(5000, "blue"); //затем через еще две меняем на синий

Автор: Aliance 19.4.2005, 14:21
У этой функции первый параметр - строчный тип данных. Почему ж нельзя smile Можно =)
См. пример Sardarа

Автор: Иль 20.4.2005, 01:05
Цитата(Aliance @ 19.4.2005, 14:21)
первый параметр

да не, я про аргументы
Цитата
window.setTimeout(функция, интервал, арг1?, …, аргN?)

Автор: Gregof 20.4.2005, 07:58
строковые и числовые параметры можно передать так:
Код

function myFunc(a){alert(a);};
function test(a,b){
window.setTimeout("myFunc('"+a+"')",1000);
window.setTimeout("myFunc("+b+")",1000);
}
test("param1",100);

А вот чтоб передать ссылку тебе надо воспользоваться примером Sardar.
Для своих нужд я написал такую вот функцию:
Код

execFunctionByTimeout=function(func,timeout){
    var arg=[],l=arguments.length,i;
    for(i=2;i<l;i++) arg[i-2]=arguments[i];
    setTimeout(function (){func.apply(null,arg);},timeout);
};

Может и тебе поможет.
Аналогично для вызова методов:
Код

execMethodByTimeout=function(obj,mh,timeout){
    var arg=new Array(),l=arguments.length,i;
    for(i=3;i<l;i++) arg[i-3]=arguments[i];
    setTimeout(function (){mh.apply(obj,arg);},timeout);
};

Автор: Иль 20.4.2005, 10:57
Пока не переворил, но понял, что чтобы не использовать вложенное определение функции как у Sardar, надо применить свойства call или apply объекта function, верно?

Автор: Gregof 20.4.2005, 11:16
Да в принципе не обязательно, но функцию посредника сделать придётся:
Код

function myFunc(a,b){alert(a+b);}
function myCaller(arg1,arg2){
setTimeout(function (){myFunc(arg1,arg2)},1000);
}
myCaller("Hello"," World!");

Автор: Иль 20.4.2005, 11:51
Gregof, я еще думаю и не применял smile, но вот, чтоб все видели, код на котором я споткнулся. Непонятно только почему он в Геко исправно работает
Код

<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<script language="JavaScript" type="text/JavaScript">
function top(el){
var i=0;
alert(i+"\n"+el.style.width)
bottom(el,i)
}

function bottom(el,i){
if(++i>3)return;
alert(i+"\n"+el.style.width)
setTimeout(bottom,50,el,i)
}
</script>
<div style="width:300;background-color:#FF0033" onClick="top(this)">Нажми</div>
</body></html>

А вот в рекурсии
Код

<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<script language="JavaScript" type="text/JavaScript">
function top(el,i){
i++
if (i>3) return;
alert(i+"\n"+el.style.width)
setTimeout(top,50,el,i)
}
</script>
<div style="width:300;background-color:#FF0033" onClick="top(this,0)">Нажми</div>
</body></html>

Автор: Gregof 20.4.2005, 12:29
В интеренте много справочников, но не всегда им можно верить smile
Напрмер :
вот http://wdh.suncloud.ru/dhtml13.htm#msettimeout
вот http://wdh.suncloud.ru/dhtml14.htm#hsettimeout
описаны идентично.
Но вот если посмотреть http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/settimeout.asp можно сразу понять почему твой код не работает smile

Автор: Иль 20.4.2005, 12:34
Гы smile , я счастлив, заработало, но счастье будет не полным если вы, господа программисты, не объясните отчего такие геморои на голову со стороны ИЕ.
Цитата
Нет, все понятно, елки, но что конкретно ты имела ввиду. Что ты имела ввиду, что ты имела в виду, что ты имелаа, а а. В ВИДУ!

песня тока есть smile
Вот так я реанимировал в моих глазах проказника smile ИЕ
Код

<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<script language="JavaScript" type="text/JavaScript">
function myFunc(a,b){
b++
alert(a.style.width+"\n"+b)
myCaller(a,b)
}

function myCaller(arg1,arg2){
if(arg2>3)return;
setTimeout(function (){myFunc(arg1,arg2)},50);
}
</script>
<br><br><div style="width:300;background-color:#FF0033" onClick="myFunc(this,0)">myFunc</div>
<br><br><br>
<br><br><div style="width:300;background-color:#FF0033" onClick="myCaller(this,0)">myCaller</div>
</body></html>

Автор: Aliance 20.4.2005, 12:42
Цитата
да не, я про аргументы

Аргументы у функций, у методов - параметры smile

Автор: Sardar 20.4.2005, 14:32
Цитата(Gregof @ 20.4.2005, 11:29)
В интеренте много справочников, но не всегда им можно верить
Напрмер :
вот про SetTimeout в Gecko
вот про SetTimeout в IE
описаны идентично.

И трудно понять зачем нужно было делать через ж... Это не единственных ляп MS...

Для ИЕ можно так извратиться:
Код
function mySetTimeOut(func, time) {
  var arg=""; var ar=[]; //arguments нужно скопировать, они не идут с контекстом далее
  for(var i=2; i<arguments.length; i++) {ar[ar.length]=arguments[i]; arg+=",ar["+(i-2)+"]";} 
  eval("window.setTimeout(function() {func("+(arg!=""? arg.substr(1): "")+");}, time);");
}


function test(a, b) {
  alert(a+", "+b+", "+(a+b));
}
mySetTimeOut(test, 2000, 34, 5);


Цитата
применить свойства call или apply объекта function, верно?

Очень хорошая вещь call и apply, но не будет работать в убогом JScript 1.3(ECMA 1.3) что стоит в ИЕ5.0 Там вобще много стандартных вещей нет, хотя бы нормальных массивов...

Автор: Иль 20.4.2005, 20:43
Ребята, это еще не все. Есть такая замечательная функция setInterval... smile

Поставим задачу повторно. Есть объект, есть ссылка на него. Надо определенное колличество раз или до условия через определенные промежутки делать что-то с объектом по этой ссылке и у объекта нет id (и даже не надейтесь smile )

И какой получается вывод: На данном отрезке истории и по вине ИЕ для SetTimeout надо ссылку на объект перекатавать между двумя функциями туда и обратно.
Хотя можно проставить скриптом случайные id и про все забыть smile smile
А для setInterval это, вроде, вообще единственное решение

И это все.
Всем спасибо, плюсы на сегодня расставил, пойду ваять

Автор: Иль 20.4.2005, 22:40
Я поторопился, способ function (){myFunc(arg1,arg2)} и в рекурсии работает
Код

setTimeout(function (){myFunc(arg1,arg2)},1000);

Ох шаманство, а не просвещение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)