[Javascript] setTimeout/setInterval in een object

Pagina: 1
Acties:
  • 251 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een object te maken, dat een functie binnen dat opject zelf uitvoert aan de hand van een timeout of interval. Graag maak ik verderop in m'n code alleen een object aan, en ik wil dat het interval tijdens het maken van een object wordt aangeroepen.

Ik heb even snel een stukje code in elkaar gezet om te demonstreren wat ik nu heb. Deze code werkt, maar ik wil graag alleen maar een object aanmaken, zonder daarna nog een setTimeout of setInterval aan te roepen. Ja ik ben een perfectionist ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
  <head>
    <script type="text/javascript">
    function ColoredObject()
    {
      this.swapColor = function swapColor()
      {
        if (document.getElementById('testdiv').style.backgroundColor == '#cccccc')
        {
        document.getElementById('testdiv').style.backgroundColor = '#ffffff';
        }
        else
        {
        document.getElementById('testdiv').style.backgroundColor = '#cccccc';
        }
      }
      this.timerId = 0;
    }
    </script>
  </head>

  <body>
    <div id="testdiv">Tekst</div>       
    <script type="text/javascript">
    ding = new ColoredObject();
    ding.timerId = setInterval('ding.swapColor();', 1000);
    // de regel hierboven heb ik hier liever niet...
    </script>
  </body>

</html>

Is het dus mogelijk om dat binnen die function ColoredObject te krijgen?
Of kan dat niet, en zit er enige logica achter waarom het niet zou kunnen?

Acties:
  • 0 Henk 'm!

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 20-08 09:22

Clay

cookie erbij?

de setTimeout en setInterval zijn functies die ter plekke uitgevoerd worden, wat je erin zet wordt pas na je gegeven tijd uitgevoerd, maar het lopende script is daar dan al lang voorbij. Je kan dus niet een timeout of interval binnen een object gebruiken en binnen dat object bezig blijven
code:
1
setTimeout('this.doeWat()', 2000)

gaat dus nooit werken omdat this niets meer is na die 2 seconden. Ik vind dit ontzettend logisch, maar daar heb ik al meer ruzie over gehad :D Dat ligt er dus maar aan of jij dat logisch vindt :) lastig is het iig wel, maar misschien is er wel iets te coden dat je
code:
1
mijnObject.setTimeout('this.functie()', 2000)

kan doen, zou iig wel tof zijn :)

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Acties:
  • 0 Henk 'm!

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 20-08 09:22

Clay

cookie erbij?

je kan aan het javascript Object ook nieuwe functies toekennen, ff wat gepookt, misschien kan hier dus wat mee:
code:
1
2
3
4
5
6
7
8
9
10
11
Object.prototype.setTimeout = customSetTimeout;
function customSetTimeout() {
   alert(this.id);
}

function kip(id) {
   this.id = id;
}

betty = new kip('betty')
betty.setTimeout()

maar dan nog zul je buiten het object om een aanroep terug dat object in moeten maken. wat dan wel handig is is dat je dat op deze manier 1 keer script, en dat die customSetTimeout dat voor de rest van al je objecten als het goed is goed oplost. :)

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op maandag 21 januari 2002 23:00 schreef Clay het volgende:
de setTimeout en setInterval zijn functies die ter plekke uitgevoerd worden, wat je erin zet wordt pas na je gegeven tijd uitgevoerd, maar het lopende script is daar dan al lang voorbij. Je kan dus niet een timeout of interval binnen een object gebruiken en binnen dat object bezig blijven
code:
1
setTimeout('this.doeWat()', 2000)

gaat dus nooit werken omdat this niets meer is na die 2 seconden. Ik vind dit ontzettend logisch, maar daar heb ik al meer ruzie over gehad :D Dat ligt er dus maar aan of jij dat logisch vindt :) lastig is het iig wel, maar misschien is er wel iets te coden dat je
code:
1
mijnObject.setTimeout('this.functie()', 2000)

kan doen, zou iig wel tof zijn :)
Ja ik dacht ook al dat dat probleem zou ontstaan, aangezien je niet weet hoe het object heet, dat je aan het maken bent. Ik zal er nog het een en ander mee proberen, maar ik had er al een slecht voorgevoel over :)

De bedoeling was dat je door enkel en alleen een object met een aantal properties aan te maken, zoals beginpositie, eindpositie, tijdsduur, kleur en tekst enzo, zodat je met een enkele regel een layer kon laten binnensliden bij het maken van de pagina. Met twee regels 'voelt' het toch net iets anders. :{

Acties:
  • 0 Henk 'm!

  • Bluestorm
  • Registratie: Januari 2000
  • Laatst online: 20-08-2022
Op maandag 21 januari 2002 23:05 schreef Clay het volgende:
maar dan nog zul je buiten het object om een aanroep terug dat object in moeten maken. wat dan wel handig is is dat je dat op deze manier 1 keer script, en dat die customSetTimeout dat voor de rest van al je objecten als het goed is goed oplost. :)
Ik heb met dat idee een saaie schooldag rondgelopen en wat uitgeschreven en net even uitgetypt...

http://www.brainpolish.com/~michiel/interval.html

is het resultaat... ok... het zijn niet meer dan twee alerts maar wel zonder dat je de naam weet van het object :)

Het is trouwens absoluut een trage constructie... zeker als je wat meer intervals tegelijk zou gebruiken... dus moet nog heel wat verbeteren :)

Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden


Acties:
  • 0 Henk 'm!

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 20-08 09:22

Clay

cookie erbij?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
OProto = Object.prototype;

OProto.setTimeout  = customSetTimeout;
OProto.setInterval = customSetInterval;
OProto.index = indexObject;

document.objects = [];

function indexObject() {
    if(!this.id) alert('object MUST have an id identifier');
    var dob = document.objects;
    if(!dob[this.id]) dob[this.id] = this;
}

function customSetTimeout(func, time) {
    this.index();
    this.timeout = setTimeout('document.objects["'+this.id+'"].'+func, time);
}

function customSetInterval(func, time) {
    this.index();
    this.interval = setInterval('document.objects["'+this.id+'"].'+func, time);
}


function kip(id) {
   this.id = id;
   this.legs = 0;
}

kip.prototype.addLeg = kipAddLeg;

function kipAddLeg() {
    this.legs ++;
    window.status = this.legs;
}

betty = new kip('betty');
betty.setInterval('addLeg()', 400);

Dit kan ook. Elk object heeft zo standaard een setInterval en setTimeout van zichzelf, en de functie die je meegeeft moet hij het object horen. Vereiste is helaas wel dat je object geindexeerd moet worden in een lijstje, en dat ie een id moet hebben, maar dat is iets wat ik zelf toch al altijd doe.
De betreffende timeout zit dan in object.timeout en/of object.interval, om ze te kunnen clearen, maar zo kan je dus wel maar 1 interval per object tegelijk hebben draaien. Misschien dat je nooit meer nodig hebt, maar zoiets moet je toch in de praktijk toepassen om te kijken wat handig is.

weet iemand trouwens of (en zo ja hoe) je iets aan de constructor van functies to kan voegen? wat ik wil is namelijk dat er automatisch een soort stack bijgehouden wordt van door welke functies en in welke volgorde er tijdens het uitvoeren van een script heengelopen wordt, en dat wil nog niet echt lukken. Je kan natuurlijk wel handmatig overal code toevoegen, maar dat wil ik nou juist niet :)

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


Acties:
  • 0 Henk 'm!

  • Bluestorm
  • Registratie: Januari 2000
  • Laatst online: 20-08-2022
Maar eigenlijk blijft uiteindelijk gewoon:
code:
1
2
3
4
5
6
7
8
9
function Kip(objectName){

    this.name=objectName;

    setTimeout(this.name+".myFunction()",500);

}

kip = new Kip("kip");

de meest praktische en veelzijdigste methode...

Het opslaan van de objecten is inderdaad ook een manier... met een functie om unieke id's te maken kun je het nog wat uitbreiden zodat je zelf geen id meer hoeft mee te geven...

Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden


Acties:
  • 0 Henk 'm!

Verwijderd

Onderstaande code gebruik ik meestal:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Object.prototype.eval = function($code)
{
   /* Voer de code binnen het desbetreffende object uit. */
   eval($code);
};

Object.prototype.setTimeout = function($code, $time)
{
   /* Declareer een variabele. */
   var $scheduleNumber = null;
   
   /* De methode "window.setTimeout" moet de code niet globaal uitvoeren, maar binnen het
   desbetreffende object. Daarom moet in een array worden bijgehouden bij welk object de methode
   "window.setTimeout" hoort. */
   if ( Object.schedules == null ) // Maak een array aan indien deze nog niet bestaat.
    Object.schedules = [];
   
   /* Maak de timeout aan die de code in het desbetreffende object laat uitvoeren. Gebruik hiervoor
   de eerder gemaakte "eval" methode van objecten. */
   $scheduleNumber = Object.schedules.push(this) - 1;
   $code = $code.replace(new RegExp('(\'|\\\\)', 'g'), '\\$1'); // Escape aanhalingstekens.
   return window.setTimeout('Object.schedules[' + $scheduleNumber + '].eval(\'' + $code + '\')'
    , $time);
};

Object.prototype.setInterval = function($code, $time)
{
   /* Declareer een variabele. */
   var $scheduleNumber = null;
   
   /* De methode "window.setInterval" moet de code niet globaal uitvoeren, maar binnen het
   desbetreffende object. Daarom moet in een array worden bijgehouden bij welk object de methode
   "window.setInterval" hoort. */
   if ( Object.schedules == null ) // Maak een array aan indien deze nog niet bestaat.
    Object.schedules = [];
   
   /* Maak de interval aan die de code in het desbetreffende object laat uitvoeren. Gebruik hiervoor
   de eerder gemaakte "eval" methode van objecten. */
   $scheduleNumber = Object.schedules.push(this) - 1;
   $code = $code.replace(new RegExp('(\'|\\\\)', 'g'), '\\$1'); // Escape aanhalingstekens.
   
   return window.setInterval('Object.schedules[' + $scheduleNumber + '].eval(\'' + $code + '\')'
    , $time);
};

Hiermee kun je het testen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function StupidNames()
{
   this.myName = 'Triyazo';
   this.yourName = 'Lennart';
}

   StupidNames.prototype.doSomething = function()
   {
    this.setTimeout('confirm(\'Is jouw naam \\\'\' + this.yourName + \'\\\'?\');', 1000);
    this.setInterval('alert(\'Mijn naam is \\\'\' + this.myName + \'\\\'!\');', 1500);
   }

$something = new StupidNames();
$something.doSomething();

Dan hoef je dus niet telkens de naam mee te geven :) En kun je gewoon in het object zelf een timeout & interval gebruiken.

En daar kom ik dan een half jaar later mee aanzetten |:(
Pagina: 1