Een tijd geleden heb ik 2 boeken gelezenover ajax en javascript. Om te kijken wat ik ermee kan heb ik geprobeerd een soort van chatbox te maken. Deze doet het volgende:
- Als een gebruiker inlogt dan wordt een teller gestart om te kijken voor hoe lang hij actief is. Als een bepaalde waarde wordt overgeschreden wordt de gebruiker op non-actief gezet.
- Als de gebruiker op enter drukt wordt de teller continue op 0 gezet
- Om de 30 seconden pingt de gebruiker de server om te zeggen dat hij nog aanwezig is. Als de gebruiker de chat wegklikt, zal na 90 seconden de gebruiker van de userlist worden gehaald.
Dit werkt allemaal best goed. Echter heb ik een probleempje. Om de 2 seconden wordt fetch aangeroepen. Hierin wordt het user lijstje en de chattext opgehaald en getoond, door fetchText en fetchUsers aan te roepen. Echter als ik in de callback van fetchUsers niet fethText aanroep, dan laat hij in de userlist de chattext zien. Volgens mij heeft dit te maken met de variabele xmlHttp die dan overschreven wordt. Ik vroeg me af of hie rniet een oplosisng voor is, zodat ik in fetchUsers niet fetchText hoef aan te roepen, maar enkel in fetch.
Ik heb de chat even live gezet op http://www.12nieuws.nl/sign-in/
Je hoeft je niet eerst aan te melden, om i de chat te komen, maar je kan alleen een username invoeren om de chat te bekijken.
Daarnaast vroeg ik me af of ik het geheel nog iets beter kan tweaken, om de serverload te verminderen. Wat zijn hier manieren voor?
- Als een gebruiker inlogt dan wordt een teller gestart om te kijken voor hoe lang hij actief is. Als een bepaalde waarde wordt overgeschreden wordt de gebruiker op non-actief gezet.
- Als de gebruiker op enter drukt wordt de teller continue op 0 gezet
- Om de 30 seconden pingt de gebruiker de server om te zeggen dat hij nog aanwezig is. Als de gebruiker de chat wegklikt, zal na 90 seconden de gebruiker van de userlist worden gehaald.
Dit werkt allemaal best goed. Echter heb ik een probleempje. Om de 2 seconden wordt fetch aangeroepen. Hierin wordt het user lijstje en de chattext opgehaald en getoond, door fetchText en fetchUsers aan te roepen. Echter als ik in de callback van fetchUsers niet fethText aanroep, dan laat hij in de userlist de chattext zien. Volgens mij heeft dit te maken met de variabele xmlHttp die dan overschreven wordt. Ik vroeg me af of hie rniet een oplosisng voor is, zodat ik in fetchUsers niet fetchText hoef aan te roepen, maar enkel in fetch.
Ik heb de chat even live gezet op http://www.12nieuws.nl/sign-in/
Je hoeft je niet eerst aan te melden, om i de chat te komen, maar je kan alleen een username invoeren om de chat te bekijken.
Daarnaast vroeg ik me af of ik het geheel nog iets beter kan tweaken, om de serverload te verminderen. Wat zijn hier manieren voor?
JavaScript:
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
| function fetch() { window.clearTimeout(timeout); fetchText(); fetchUsers(); if (timedout != 1) { setTimers(); } } function fetchText() { url = "textchat.php?r=" + rnd; createXMLHttpRequest(); xmlHttp.open("GET",url); xmlHttp.send(null); xmlHttp.onreadystatechange = callbackFetchtext; } function callbackFetchtext() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { obj = document.getElementById("chatlist"); obj.innerHTML = xmlHttp.responseText; } } } function fetchUsers() { url = "userchat.php?r=" + rnd; createXMLHttpRequest(); xmlHttp.open("GET",url); xmlHttp.send(null); xmlHttp.onreadystatechange = callbackFetchusers; } function callbackFetchusers() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { obj = document.getElementById("userlist"); obj.innerHTML = xmlHttp.responseText; fetchText(); } } } |