Avatar billede cybermolle Nybegynder
27. januar 2006 - 14:09 Der er 15 kommentarer og
1 løsning

Problemer med setTimeout i Internet Explorer

Jeg har været i gang med at lave en simpel live chat ved at bruge javascript og PHP.

Problemet er at Internet Explorer opdatere ikke chat loggen, når andre folk de poster et indlæg i chatten. Jeg har ingen problemer med Firefox.

Da javascript koden er en anelse lang (161 linjer) - har jeg lagt en kopi af javascript koden her:

http://www.daimi.au.dk/~molgaard/javascript/chat.js

HTML koden til hjemmesiden ser således ud:

------------------

<html>
  <head><title>Live chat</title>
  <script language="javascript" type="text/javascript" src="chat.js"></script></head>
  <body onload="initChat()">
  <form name="chatForm" action="java script:;>
    <table>
      <tr><td valign="top">Nickname :</td>
      <td valign="top">[PHP kode]</td></tr>

      <tr><td valign="top">Message :</td>
      <td><textarea id="message" name="message" cols="30" rows="5"></textarea></td></tr>

      <tr><td valign="top">
      <input type="submit" value="Send" onclick="java script:sendMessage();" />

      <input type="submit" value="Logout" onclick="java script:logout();" />

      <input type="hidden" value="[PHP kode]" name="user" id="user" />
      </td></tr>
    </table>
  </form>
  <div id="chatArea"></div>
</html>

------------------

Er der nogen der har en ide til hvorfor Internet Explorer vil ikke opdatere chat loggen?
Avatar billede cybermolle Nybegynder
27. januar 2006 - 14:10 #1
uuups!

starten af formen er naturligvis:
<form name="chatForm" action="java script:;">
Avatar billede olebole Juniormester
27. januar 2006 - 17:38 #2
<ole>

Hvad er problemet præcist - og får du evt. JS-fejl?

På dine input-tags ser det ud somom, du bruger XHTML ... men der kan du ikke bruge 'innerHTML' - og heller ikke 'document.location', som i øvrigt har været deprecated i mange år. Det hedder 'window.location'  :)

/mvh
</bole>
Avatar billede cybermolle Nybegynder
27. januar 2006 - 18:06 #3
Ok - efter at have debugget noget mere, så er det denne del af koden der fejler i IE:

function initChat()
{
  receiveChat();
}

// Handles the request for the chat log to the server.
function receiveChat()
{
  if(receiveHandler.readyState == 4 || receiveHandler.readyState == 0)
  {
    receiveHandler.onreadystatechange = handleReceiveChat;
    receiveHandler.open('GET', receiveURL, true);
    receiveHandler.send(null);
  }
}

var timer;
var callTick = 0;

// Handles the request chat log response from the server
function handleReceiveChat()
{
  if(receiveHandler.readyState == 4)
  {
    displayContent(receiveHandler.responseXML);
    timer = window.setTimeout("receiveChat();", 4000);
  }
}

------

Som du kan se fra HTML koden bliver initChat() kaldt når siden loades. Derefter kaldes receiveChat() og når chatloggen er hentet ind, så vil handleReceiveChat() blive kaldt.

Det næste der sker er at 4 sekunder senere kalder klienten ganske vist serveren for at få fat i den nyeste chat log, men handleReceiveChat() bliver aldrig aktiveret, så lang tid man bruger Internet Explorer.

I Firefox er der ingen problemer, og jeg under mig over hvorfor.

Javascript konsollen i Firefox røber ingen problemer, og Internet Explorer og også tavs.
Avatar billede cybermolle Nybegynder
27. januar 2006 - 18:14 #4
øhm "callTick" er en variabel jeg glemte at slette efter debugning.
Avatar billede olebole Juniormester
30. januar 2006 - 07:25 #5
Har du prøvet at sætte callback-handleren efter, du har åbnet forbindelsen:

    receiveHandler.open('GET', receiveURL, true);
    receiveHandler.onreadystatechange = handleReceiveChat;
    receiveHandler.send(null);
Avatar billede cybermolle Nybegynder
30. januar 2006 - 12:53 #6
Desværre, det gav intet nyt i Internet Explorer.

Fik dog rettet lidt på koden, da receiveChat bliver kaldt både når hjemmesiden loades, men også når en bruger sender en besked til serveren.

Problemet er i dette tilfælde at der bliver oprettet en ny timer tråd, for hvert nyt indlæg på serveren, med det resultat at den enkelte klient bruger flere og flere af serverens ressourcer.

Ved at debugge på kaldene kan jeg se at receiveChat() bliver kaldt ved hver iterering af min loop i updateChat(), men Internet Explorer ignorere onreadystatechange linjen i receivechat.

Min nye kode er derfor:

// This function handles what todo when the page loads
function initChat()
{
    updateChat();
}

function updateChat()
{
    receiveChat();
    setTimeout("updateChat()", 4000);
}

function receiveChat()
{
      receiveHandler.open('GET', receiveURL, true);
      receiveHandler.onreadystatechange = function ()
    {
        if(receiveHandler.readyState == 4)
        {
            displayContent(receiveHandler.responseXML);
        }

    };
      receiveHandler.send(null);
}
Avatar billede olebole Juniormester
30. januar 2006 - 12:57 #7
- hvad sker der, hvis du skriver:

receiveHandler.onreadystatechange = function() {
    alert(receiveHandler.readyState)
};
Avatar billede cybermolle Nybegynder
30. januar 2006 - 13:01 #8
1. iterering: 1, 2, 3, 4.
2. iterering: 1, 2, 3, 4.
3. iterering: 1, 2, 3, 4.

O.s.v.
Avatar billede cybermolle Nybegynder
30. januar 2006 - 13:05 #9
Ok... Nu kan jeg se den bliver kaldt. Nu skal jeg bare debugge min displayContent...
Avatar billede olebole Juniormester
30. januar 2006 - 13:08 #10
Det her fungerer jo i hvert fald fint:

<script type="text/JavaScript">
receiveURL = "test.xml";
function receiveChat() {
    var receiveHandler = new ActiveXObject("msxml2.XMLHTTP");
    receiveHandler.open('GET', receiveURL, true);
    receiveHandler.onreadystatechange = function(){
        if(receiveHandler.readyState == 4) {
            alert(receiveHandler.responseText);
            receiveHandler = null;
        }
    };
    receiveHandler.send(null);
}
</script>

<button onclick="receiveChat()">TEST</button>

- og så er det bedst at åbne og destruere ActiveX-objektet hver gang, det skal bruges  :)
Avatar billede olebole Juniormester
30. januar 2006 - 13:09 #11
- eller rettere xmlHTTP-objektet  :)
Avatar billede cybermolle Nybegynder
30. januar 2006 - 13:12 #12
Hmmm... har en ide nu om det er min displayContent kode der er gal, da den bruger innerHTML til at vise koden på hjemmeside.

Det ser ud til at den skal skrives om, så Internet Explorer kan forstå den.

Ok jeg må hellere gå i gang med at genopfriske hvordan DOM fungere...

Sender du et svar, så du kan få point?
Avatar billede olebole Juniormester
30. januar 2006 - 13:20 #13
Ja, du skal passe på med at bruge referencer som:
    var node = xmlDoc.documentDocument.childNodes[3];

Der er forskel på, om browseren tager evt. white-space i XML-koden med eller ej. Hvis den gør, er hver 'klump' white-space også en node  ;o)
Avatar billede olebole Juniormester
30. januar 2006 - 13:20 #14
- og et svar  :)
Avatar billede olebole Juniormester
30. januar 2006 - 13:29 #15
Tak for points  :)
Avatar billede cybermolle Nybegynder
30. januar 2006 - 13:31 #16
Det mig der takker for hjælpen!

Har siddet og stirret ind i koden og undrede mig over hvorfor visse dele ikke blev kaldt...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester