[JS] onKeyUp race condition?

Pagina: 1
Acties:

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 01-12 19:36
Met AJAX verstuur ik informatie van een formulier op het moment dat het ingevuld word.

Ik heb echter een probleem als de gegevens te snel er ingerammeld of verwijderd worden dat het niet zoals geplanned werkt.

Dmv van een onKeyUp event word de functie aangeroepen die een http xml verzoek stuurt. Hieronder heb ik een test script staan die het probleem dat ik heb verder kan uit leggen. (het probleem zit iig totaal niet in het AJAX gedeelte).

Ik heb 10 velden. Worden gegevens rustig ingevuld dan komen deze keurig in het div element te staan.
Op het moment dat ik er vlot gegevens in ga stoppen (1 t/m 10 bv) dan lijkt het er op dat het event gemist word.

Een oplossing is dat ik gebruik ga maken van onChange als event. Maar hierbij is het nadeel dat als je op een veld blijft staan, dat hier niets mee gedaan word.

Hoe zou ik dit probleem op kunnen lossen?


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script>
function update(val) {
    document.getElementById('test').innerHTML = document.getElementById('test').innerHTML + val + ' ';
}
</script>


<input type=button onClick="update()" />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />

<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />
<input type=text onKeyup="update(this.value)" size=2 />

<div id="test">jawel
</div>

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ergens globaal opslaan of je update-functie al bezig is of niet, zo ja de volgende update 'schedulen' voor een later tijdstip (mbv setTimeout bijvoorbeeld).

Intentionally left blank


Verwijderd

crisp schreef op dinsdag 21 november 2006 @ 14:39:
ergens globaal opslaan of je update-functie al bezig is of niet, zo ja de volgende update 'schedulen' voor een later tijdstip (mbv setTimeout bijvoorbeeld).
Ik zou dat sowieso allemaal achter een setTimeout zetten want anders wordt er gegarandeerd bij elke toetsaanslag een request verstuurd.
JavaScript:
1
2
3
4
5
6
7
8
9
var _iUpdateTimeout = null;
function update( s ) {
    if(_iUpdateTimeout != null) clearTimeout(_iUpdateTimeout);
    _iUpdateTimeout = setTimeout(400, 
        function() {
            // doe hier je request stuff
        }
    );
}

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 01-12 19:36
Dat er bij elke toetsaanslag een reqeust word verstuurd is momenteel nog niet het probleem. (het stukje code was ook enkel als proof geschreven)

Als ik bij een bepaalde waarde al overal ingevuld heb en die verander ik, word de functie met de oude waarde nog geupdate. Dat is het probleem. Ik krijg bv 0 0 0 0 0 0 0 0 0 0 x 0 0 0 x 0 0 0 x 0 0 0 0 0 0 0 0 0 x te zien wanneer het eerst 0 was en alles naar x veranderde in rap tempo.

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/