Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> setTimeout и передача ссылки на объект в параметре 
:(
    Опции темы
Иль
Дата 19.4.2005, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 19.4.2005, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Всегда давай код 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"); //затем через еще две меняем на синий



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 19.4.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



У этой функции первый параметр - строчный тип данных. Почему ж нельзя smile Можно =)
См. пример Sardarа
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 20.4.2005, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Цитата(Aliance @ 19.4.2005, 14:21)
первый параметр

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



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Gregof
Дата 20.4.2005, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 3.6.2004

Репутация: 1
Всего: 12



строковые и числовые параметры можно передать так:
Код

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);
};


Это сообщение отредактировал(а) Gregof - 20.4.2005, 08:02
--------------------
Может поздно, может рано, нет у времени стоп-крана... (Чайф)
PM MAIL ICQ   Вверх
Иль
Дата 20.4.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Gregof
Дата 20.4.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 3.6.2004

Репутация: 1
Всего: 12



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

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

--------------------
Может поздно, может рано, нет у времени стоп-крана... (Чайф)
PM MAIL ICQ   Вверх
Иль
Дата 20.4.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



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>


Это сообщение отредактировал(а) Иль - 20.4.2005, 12:10


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Gregof
Дата 20.4.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 3.6.2004

Репутация: 1
Всего: 12



В интеренте много справочников, но не всегда им можно верить smile
Напрмер :
вот про SetTimeout в Gecko
вот про SetTimeout в IE
описаны идентично.
Но вот если посмотреть про setTimeout на msdn можно сразу понять почему твой код не работает smile
--------------------
Может поздно, может рано, нет у времени стоп-крана... (Чайф)
PM MAIL ICQ   Вверх
Иль
Дата 20.4.2005, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Гы 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>


Это сообщение отредактировал(а) Иль - 20.4.2005, 19:11


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 20.4.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата
да не, я про аргументы

Аргументы у функций, у методов - параметры smile
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 20.4.2005, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(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 Там вобще много стандартных вещей нет, хотя бы нормальных массивов...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 20.4.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Ребята, это еще не все. Есть такая замечательная функция setInterval... smile

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

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

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



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 20.4.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Я поторопился, способ function (){myFunc(arg1,arg2)} и в рекурсии работает
Код

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

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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.