Einfacher Ajax-Chat. Will nicht im IE



  • aaalso ich experimentiere weiter..

    Seit drei tagen versuch ich jetzt, einen kleinen Chat zu basteln.(es geht mir dabei um das automatische Aktualisieren.

    Meine HTML-Seite ist sehr simpel gestrickt.

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    		<meta http-equiv="Pragma" content="no-cache" />
    
    		<title>my tiny chat</title>
    		<script type="text/javascript" src="chat.js"></script>
    	</head>
    	<body>
    
    	<form>
    		<div id="content" style="width: 600px; height: 400px"></div>
    		<div style="position: absolute; bottom: 20px">
    			username <input type="text" id="username" name="username" value="user" /> 
    			text <input type="text" id="text" name="text" style="width: 300px" onkeypress="submitEnter(event)" /> 
    			<input type="button" name="submit" value="senden" onclick="submitEnter(event)"/></div>
    	</form>
    
    	</body>
    </html>
    

    Mein Javascript sieht so aus:

    var requestObject;
    
    // get a request object
    
    try {
    	requestObject = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
    	try {
    		requestObject = new ActiveXObject("MSXML2.XMLHTTP");
    	} catch (e) {
    		try {
    			requestObject = new XMLHttpRequest();
    		} catch (e) {
    			alert("Konnte kein Request-Objekt erstellen.");
    		}
    	}
    }
    
    var timeout = setTimeout('request()', 1000);
    
    function submitEnter(e) {
    	var keycode;
    	if (window.event)
    		keycode = window.event.keyCode;
    	else if (e)
    		keycode = e.which;
    	else
    		return;
    
    	if (keycode == 13)
    		sendText();
    
    }
    
    function sendText() {
    	var username = document.getElementById("username").value;
    	var text = document.getElementById("text").value;
    	if (text != "") {
    		document.getElementById("text").value = "";
    		requestObject.open('get', 'Chat?name=' + username + '&text=' + text,
    				true);
    		requestObject.onreadystatechange = function() {		
    		};
    		requestObject.send(null);
    	}
    }
    
    function request() {
    	clearTimeout(timeout);
    	requestObject.open('get', 'Chat', true);
    	requestObject.onreadystatechange = function() {
    		if (requestObject.readyState == 4) {
    			document.getElementById("content").innerHTML = requestObject.responseText;
    //			alert("Test");
    			timeout = setTimeout("request()", 1000);
    		}
    	};
    	requestObject.send(null);
    }
    

    Das aufgerufene Servlet zaubert ein wenig.. ist weniger interessant, denk ich.

    Starte ich das Ganze mit Mozilla, hab ich nen schönen chat, der mir allerdings erklärt, dass ich in den ausgaben des servlets auch junk drin habe (ich habe jede zeile in ein span mit abschließendem br gepackt)

    Der IE ist hochgradig merkwürdig:
    Der Inhalt ist zum Einen scheinbar eher von Platte geladen als alles andere. Auch der Timeout wird nicht wiederholt.
    Im Servlet hab ich mal den aufrufenden Browser ausgegeben und ich sehe dort nur den Firefox.

    Auch habe ich mal versucht, das content-div gegen eine Textarea auszutauschen- ohne Erfolg.
    Kann mir wer erklären, wo da der Pudel im Wald vergraben liegt???

    Edit: Nehme ich den Kommentar vor dem alert aus, wird der alert regelmäßig durchgeführt und laut Ausgabe des Servlets der Request gestellt...



  • Hallo,

    du rufst gar keine Funktion nach erteiltem Request auf...

    function sendText() { 
        var username = document.getElementById("username").value; 
        var text = document.getElementById("text").value; 
        if (text != "") { 
            document.getElementById("text").value = ""; 
            requestObject.open('get', 'Chat?name=' + username + '&text=' + text, 
                    true); 
            requestObject.onreadystatechange = request;
            requestObject.send(null); 
        } 
    } 
    
    function request() { 
        clearTimeout(timeout); 
            if (requestObject.readyState == 4) { 
                document.getElementById("content").innerHTML = requestObject.responseText; 
                timeout = setTimeout("request()", 1000); 
            } 
    }
    

    LG, Micha



  • Nein, aaber zyklisch:

    var timeout = setTimeout('request()', 1000);
    

    Würd ich's beim Senden des Texts machen, würde ich ja immer mehr timeouts generieren...



  • Du darfst setTimeout() nicht mit setInterval() verwechseln! 😉


Anmelden zum Antworten