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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объектная модель, Как использоват функции таймера в объект 
:(
    Опции темы
maxkazar
Дата 3.12.2004, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Необходимо в объекте использовать задержку(таймер) window.setTimeout().
Например:
Код

function Test() {
 this.Action = fnAction
 this.SetTimer = fnSetTimer
 this.Name = "Test"

 function fnAction() {
   alert(this.Test)
 }

 function fnSetTimer() {
   setTimerout("this.Action()",1000)
 }

}

var T = new Test()
T.SetTimer()



Вот так бы хотелось в идеале....но к сожалению так не получится(. Т.к. вызов функции таймера (в примере this.Action() ) происходит в конетксте основного объекта (если я не ошибаюсь это будет объект window). Соответсвенно возникнет ошибка!. А как же тогда быть....как поставить таймер в объекте. Как сделать чтоб в обработчике таймера можно было использовать свойтва и методы самого объекта....

Мне в голову приходит только один способ....где-то надо хранить имя объекта (в примере T) а потом уже в обработчике получать ссылку на имя....но это полный геморой (очень далеко от идела!)
PM MAIL ICQ   Вверх
Sardar
Дата 3.12.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



maxkazar да это проблема, которая и меня порой достает...
window.setTimeout всегда исполняет функцию в контексте window. Я писал два решения, первое прописать всем функциям ссылку на обéкт:
Код

function myObj(n) {
this.test=n;

this.bla=function() {
  alert(arguments.callee.target.test); //берем переменную по ссылке на обьект
};
this.bla.target=this; //ссылка на обьект

this.timetest=function() {
   window.setTimeout(this.bla,1000); //ставим обычный таймер
}
}

var m=new myObj(34);
m.timetest();
var m=new myObj(100);
m.timetest();

Недаостаток что нужно всегда определять функции в конструкторе, что бы у каждого обьекта был свой обьект функция держущая ссылку на обьект target. Также ссылка arguments.callee по моему не существуетв ИЕ5.0

Можно завести регистр обьектов, в который будем складывать всех кто обратился на паузу:
Код
function myObj(n) {
this.test=n;
this.bla=function() {alert(this.test);};

this.timetest2=function() {
  window.setTimerout(this, "bla", 1000);
}
}

setTimerout.targets={};
function setTimerout(obj, func, time) {
 var uname="~" + Math.random(); //имя должно быть уникальным, сделал по быстрому, перепиши
 setTimerout.targets[uname]={tg:obj,fn:func};
 window.setTimeout("runTimerout('"+uname+"');", time); //вызываем нашь обработчик с ИД обьекта
}
function runTimerout(id) {
 if(typeof(setTimerout.targets[id])=="object") {
   var r=setTimerout.targets[id];
   delete setTimerout.targets[id];
   r.tg[r.fn](); //так будет работать везде
//    r.fn.call(r.tg); //если передавать не имя а функцию, но так не будет работать в ИЕ5.0
 }
}


var m=new myObj(34);
m.timetest2();
var m=new myObj(100);
m.timetest2();


Можно еще извратится, главное не уйти слишком далеко smile


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


Новичок



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

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



Вот жешь....все гениально и просто, как это я сам не догадался... Просто в самом объекте надо хранить сылку на сам объект!....это вполне нормально....я данный подход использовал и раньше вот только здесь не попробывал))
PM MAIL ICQ   Вверх
Се ля ви
Дата 3.12.2004, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Господа, а почему бы не передавать ссылку на объект как параметр функции? Это конечно тоже кривовато, но всё-таки красифше и универсальней:
Код

m.Action(m);

Разве не меньшее из зол?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Sardar
Дата 4.12.2004, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата
Разве не меньшее из зол?

И так тоже будет работать, просто выглядеит ну совсем не как ООП... smile


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


 




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


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

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