[JS] Too much recursion?

Pagina: 1
Acties:

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function getPosition(e)
{
    //Determine the position of the cursor
    var e=e||window.event;
    var cursor={x:0, y:0};
    if (e.pageX||e.pageY)
    {
        cursor.x=e.pageX;
        cursor.y=e.pageY;
    } 
    else
    {
        var de=document.documentElement;
        var b=document.body;
        cursor.x=e.clientX + 
            (de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
        cursor.y=e.clientY + 
            (de.scrollTop||b.scrollTop)-(de.clientTop||0);
    }
    X['cursor']=cursor.x;
    Y['cursor']=cursor.y;
    setTimeout(getPosition(e),1000);
}


Bij die setTimeout geeft de JS console in FF de melding dat er teveel recursie is. De bedoeling is dat de functie de hele tijd door checkt waar de cursor is. Ik snap alleen niet waarom ik dan een foutmelding krijg als hij om de seconde zichzelf weer aanroept, zo belastind is het toch niet? Ik bedenk me nu ook dat ik de functie 'op standby kan zetten' als de pagina geen focus heeft, of weet één van jullie misschien of de cursor sowieso niet gecheckt kan worden als de pagina geen focus heeft?

//edit: Hij roept de functie wel elke keer netjes weer aan, maar elke keer als hij setTimeout uitvoert, dan krijg ik de melding van die recursie.

[ Voor 9% gewijzigd door Mei op 20-07-2006 23:12 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

Een setTimeout kan geen event triggeren, dus de 2de keer werkt je regel 4 niet meer.

Ik zou gaan voor zoiets:
JavaScript:
1
document.body.onmousemove = getPosition();


Ps. In je setTimeout moeten er " om de aan te roepen functie heen.

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Maar als dat event als e aan de functie gegeven wordt, dan kan die timeout die waarde toch gewoon weer doorgeven?

Ik had eerst ook onmousemove, maar dan krijg je weer dat het script als een razende door die loop heen gaat. Bij Firefox krijg je dan de melding dat de boel in een infinite loop zit en het belast de boel gewoon onnodig. Volgens mij was er trouwens geen functie die een kleine vertraging inbouwde, zodat een loop niet dom doorgaat, maar even een halve seconde wacht?

Verwijderd

Wat er nu gebeurt op de laatste regel van je function is dat de parser eerst je getPosition(e) evalueert, en blijft dit gewoon doen zonder ooit de setTimeout aan te roepen. Sim-pel.

  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

Mei schreef op donderdag 20 juli 2006 @ 23:18:
Maar als dat event als e aan de functie gegeven wordt, dan kan die timeout die waarde toch gewoon weer doorgeven?
Nee ;)
Ik had eerst ook onmousemove, maar dan krijg je weer dat het script als een razende door die loop heen gaat.
Daarom moet de setTimeout er dan ook uit, dan is er geen loop meer.
Bij Firefox krijg je dan de melding dat de boel in een infinite loop zit en het belast de boel gewoon onnodig. Volgens mij was er trouwens geen functie die een kleine vertraging inbouwde, zodat een loop niet dom doorgaat, maar even een halve seconde wacht?
Die functie ken ik niet, ik ken alleen de setTimeout. ;)

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
André schreef op donderdag 20 juli 2006 @ 23:37:
[...]

Daarom moet de setTimeout er dan ook uit, dan is er geen loop meer.
Verkeerde uitleg van mijn kant ;) Als ik bij elke mousemove getPosition aanroep, dan wordt de functie flink aangeroepen, ik vraag me af of dit niet te veel is. Verder heb ik nog een andere functie die zichzelf moet herhalen, maar als ik daar een loop gebruik, dan gaat hij daar dus als een razende doorheen. Vandaar dat ik probeerde met setTimeout een soort van vertraging in te bouwen, maar daar geeft hij óók aan dat er teveel recursie is, hoe zou ik dit op kunnen lossen?

Verwijderd

Je kan natuurlijk ook gewoon die onmousemove behavior aan je body hangen alleen wanneer je de coördinaten van de muis nodig hebt:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function updatePosition(e) {
    [...]
}

function startListen() {
    document.body.onmousemove = updatePosition;
}

function stopListen() {
    document.body.onmousemove = null;
}


^-- in het kort

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

dit moet prima gaan, zo zwaar is je functie niet.
wat je MISSCHIEN zou kunnen doen is het volgende:

Een setTimeOut / setInterval functie die om de x ms het volgende doet:
document.onMouseMove = getPosition;

die getPosition haalt dan de waardes van je muis op en zet vervolgens:
document.onMouseMove = null;

Let op: niet getest.
Bij mijn weten zijn interval / timeout functies ook vrij pittig voor een browser.

Een andere manier is:
JavaScript:
1
2
3
4
5
6
7
var i = 0;
onMouseMove() {
  i++
  if(i = 1000) {
    doe je functie;
    i = 0;
  }

Alleen update ie dan niet op een vaste tijd, want als de gebruiker de muis niet beweegt dan wordt de functie ook niet aangeroepen.


Heb zelf al mousemove functies die ongeveer 100+ regels zijn, geen centje pijn.

Raar... Is zo gek nog niet


  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024
Bedankt voor alle replies, ik ga eens een beetje proberen :)

Het is verder helemaal geen probleem als er geen nieuwe coördinaten binnenkomen als de muis niet beweegt, want ik sla ze telkens op, zodat de positie altijd beschikbaar is.

Even wat verklappen: Het gaat om een drag 'n drop script. Ik heb er al divere gezien op internet, maar veel zijn IE-only of zijn best lomp, vandaar dat ik nu zelf wat probeer te maken. De grove opzet zit in mijn hoofd, moet alleen nog kijken of het gaat werken, ben namelijk niet zo'n javascriptgoeroe.

  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

Mei schreef op vrijdag 21 juli 2006 @ 10:22:
[...]
Vandaar dat ik probeerde met setTimeout een soort van vertraging in te bouwen, maar daar geeft hij óók aan dat er teveel recursie is, hoe zou ik dit op kunnen lossen?
Dat heeft te maken met het verkeerd gebruik van setTimeout. Je plaatst geen " om je functieaanroep heen waardoor hij hem direct gaat uitvoeren. Hierdoor zal die melding over te veel recursie ontstaan.

Roep die functie 1 keer aan en vervolgens zal hij zich pas herhalen om de 1000ms ;)

JavaScript:
1
2
3
4
5
6
7
function getPosition()
{
  // bla


  setTimeout("getPosition()",1000); 
}

[ Voor 9% gewijzigd door André op 21-07-2006 11:19 ]

Pagina: 1