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();
|
Можно еще извратится, главное не уйти слишком далеко |