-
August 1st, 2007, 04:54 PM
#1
Ajax seems to kill IE
I have a simple 2 way ajax chat system. Basically it's to allow someone to have 1 on 1 conversations with multiple people. It works fine in FF and Opera but for some reason in IE after a period of time, about 20-30 minutes, IE will stop loading the page. You can't even browse to the page any more. The only way to fix the issue is to restart IE.
I can't figure out why. It's like the pipe I make to the server do not close and keep recreating themselves over and over until IE fails.
Code:
var updateInterval = 1000;
var users_content;
var chat_text;
var chat_content;
var buttons;
var xmlHttpGetUsers = createXmlHttpRequestObject();
var xmlHttpGetChats = createXmlHttpRequestObject();
var xmlHttpGetButtons = createXmlHttpRequestObject();
var xmlHttpGetSendMessage = createXmlHttpRequestObject();
var timer_chats;
var isDown = false;
function createXmlHttpRequestObject() {
// will store the reference to the XMLHttpRequest object
var xmlHttp;
// this should work for all browsers except IE6 and older
try {
// try to create XMLHttpRequest object
xmlHttp = new XMLHttpRequest();
} catch(e) {
// assume IE6 or older
var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
// try every prog id until one works
for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) {
try {
// try to create XMLHttpRequest object
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
} catch (e) {}
}
}
// return the created object or display an error message
if (!xmlHttp) {
alert("Error creating the XMLHttpRequest object.");
} else {
return xmlHttp;
}
}
/*=== Users ====*/
function requestUsers() {
//Random number of IE
var ran_number = Math.random()*5;
//URL to go to
var url = 'get_users.php?my='+my+'&type='+u_type+'&get_users=1&trash='+ran_number;
if(xmlHttpGetUsers) {
try {
// don't start another server operation if such an operation
// is already in progress
if (xmlHttpGetUsers.readyState == 4 || xmlHttpGetUsers.readyState == 0) {
// call the server page to execute the server-side operation
xmlHttpGetUsers.open("GET", url, true);
xmlHttpGetUsers.onreadystatechange = handleReceivingUsers;
xmlHttpGetUsers.send(null);
} else {
// we will check again for new users
setTimeout("requestUsers();", updateInterval);
}
} catch(e) {
displayError(e.toString());
}
}
}
function handleReceivingUsers() {
// continue if the process is completed
if (xmlHttpGetUsers.readyState == 4) {
// continue only if HTTP status is "OK"
if (xmlHttpGetUsers.status == 200) {
try {
// process the server's response
readUsers();
} catch(e) {
// display the error message
displayError(e.toString());
}
} else {
// display the error message
displayError(xmlHttpGetUsers.statusText);
}
}
}
function readUsers() {
// retrieve the server's response
var response = xmlHttpGetUsers.responseText;
//Clear the users
users_content.innerHTML = '';
//If there is an error
if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 ) displayError('Sever Error '+response);
//If there is no data
if (response.length == 0) {
setTimeout("requestUsers();", updateInterval);
return;
}
//Set the users HTML to the response
users_content.innerHTML = response;
//Reset the timer
setTimeout("requestUsers();", updateInterval);
}
/*=== Chats ===*/
function requestChats() {
//Random number of IE
var ran_number = Math.random()*5;
//URL to go to
var url = 'chat.php?last_chat='+last_chat+'&sid='+chat_id+'&type='+u_type+'&my='+my+'&trash='+ran_number;
if(xmlHttpGetChats) {
try {
// don't start another server operation if such an operation
// is already in progress
if (xmlHttpGetChats.readyState == 4 || xmlHttpGetChats.readyState == 0) {
// call the server page to execute the server-side operation
xmlHttpGetChats.open("GET", url, true);
xmlHttpGetChats.onreadystatechange = handleReceivingChats;
xmlHttpGetChats.send(null);
} else {
// we will check again for new messages
timer_chats = setTimeout("requestChats();", updateInterval);
}
} catch(e) {
displayError(e.toString());
}
}
}
function handleReceivingChats() {
// continue if the process is completed
if (xmlHttpGetChats.readyState == 4) {
// continue only if HTTP status is "OK"
if (xmlHttpGetChats.status == 200) {
try {
// process the server's response
readChats();
} catch(e) {
// display the error message
displayError(e.toString());
}
} else {
// display the error message
displayError(xmlHttpGetChats.statusText);
}
}
}
function readChats() {
// retrieve the server's response
var response = xmlHttpGetChats.responseText;
//Split the response
var ret = new Array(2);
ret = get_last_chat(response);
response = ret[0];
last_chat = ret[1];
if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 ) displayError('Sever Error '+response);
if (response.length <= 1) {
timer_chats = setTimeout("requestChats();", updateInterval);
return;
}
chat_content.innerHTML = chat_content.innerHTML + response;
chat_content.scrollTop = chat_content.scrollHeight;
timer_chats = setTimeout("requestChats();", updateInterval);
}
/*=== Send Chat ===*/
function send_chat_text() {
//Random number of IE
var ran_number = Math.random()*5;
//URL to go to
//We encode it in base 64 just to make sure that nothing gets lost in translation
var url = 'chat.php?my='+my+'&type='+u_type+'&text='+ encode(chat_text.value) +'&chat_id=' +chat_id+'&trash='+ran_number;
//Clear the text area
chat_text.value ='';
chat_text.focus();
//Send the command
if(xmlHttpGetSendMessage) {
try {
// don't start another server operation if such an operation
// is already in progress
if (xmlHttpGetSendMessage.readyState == 4 || xmlHttpGetSendMessage.readyState == 0) {
// call the server page to execute the server-side operation
xmlHttpGetSendMessage.open("GET", url, true);
xmlHttpGetSendMessage.send(null);
}
} catch(e) {
displayError(e.toString());
}
}
}
/*=== Buttons ===*/
function requestButtons() {
var ran_number = Math.random()*10;
var url = 'get_buttons.php?sid='+chat_id+'&my='+my+'&type='+u_type+'&trash='+ran_number;
// only continue if xmlHttpGetMessages isn't void
if(xmlHttpGetButtons) {
try {
// don't start another server operation if such an operation
// is already in progress
if (xmlHttpGetButtons.readyState == 4 || xmlHttpGetButtons.readyState == 0) {
// call the server page to execute the server-side operation
xmlHttpGetButtons.open("GET", url, true);
xmlHttpGetButtons.onreadystatechange = handleReceivingButtons;
xmlHttpGetButtons.send(null);
}
} catch(e) {
displayError(e.toString());
}
}
}
function handleReceivingButtons() {
// continue if the process is completed
if (xmlHttpGetButtons.readyState == 4) {
// continue only if HTTP status is "OK"
if (xmlHttpGetButtons.status == 200) {
try {
// process the server's response
readButtons();
} catch(e) {
// display the error message
displayError(e.toString());
}
} else {
// display the error message
displayError(xmlHttpGetButtons.statusText);
}
}
}
function readButtons() {
// retrieve the server's response
var response = xmlHttpGetButtons.responseText;
if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 ) displayError('Sever Error '+response);
if (response.length == 0) {
return;
}
buttons.innerHTML = response;
}
/*=== Other Functions ===*/
// function that displays an error message
function displayError(message) {
alert("Error accessing the server! "+ "\r\n" + message);
}
function get_last_chat(Request) {
var ret = new Array(2);
loc = Request.indexOf('<last_chat>');
loc2 = Request.indexOf('</last_chat>');
if ((loc-1) <= 0) {
ret[0] = '';
} else {
ret[0] = Request.substring(0, loc-1);
}
ret[1] = Request.substring(loc+11, loc2);
return ret;
}
function keydown(e) {
var characterCode; //literal character code will be stored in this variable
e = (!e) ? window.event : e;
characterCode = (e.charCode) ? e.charCode :
((e.keyCode) ? e.keyCode :
((e.which) ? e.which : 0));
//If Shift
if (characterCode == 16) {
isDown = true;
}
//If CTRL
if (characterCode == 17) {
isDown = true;
}
}
function checkEnter(e){ //e is event object passed from function invocation
var characterCode; //literal character code will be stored in this variable
e = (!e) ? window.event : e;
characterCode = (e.charCode) ? e.charCode :
((e.keyCode) ? e.keyCode :
((e.which) ? e.which : 0));
if(characterCode == 13 && (isDown == null || !isDown)){ //if generated character code is equal to ascii 13 (if enter key)
send_chat_text(); //submit the form
return false;
} else {
isDown = false;
return true;
}
}
function change_chat(chatid) {
clearTimeout(timer_chats);
//Add the chat just sent
chat_content.innerHTML = '';
//Set focus back to it
chat_text.focus();
chat_id = chatid;
last_chat = 0;
requestButtons();
requestChats();
}
function loader() {
users_content = xGetElementById("users");
chat_text = xGetElementById("chat_text");
chat_content = xGetElementById("chat_content");
buttons = xGetElementById("chat_buttons");
requestUsers();
requestChats();
chat_text.focus();
}
if (window.addEventListener) {
window.addEventListener("load", loader, false);
} else if (window.attachEvent) {
window.attachEvent("onload", loader);
}
Any ideas?
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|