Buongiorno a tutti :P e no, non è la solita richiesta di come si costruisce una Chat di quel tipo, quello di cui ho bisogno è tutt'al più il parere di qualche esperto nel campo per poter migliorare quella che è l'applicazione che ho sviluppato, mi spiego meglio:
- La Chat è sviluppata su un sistema di chiamate asincrone, il response che ne viene dato viene passato sotto il controllo di un valore, se il valore è di un dato tipo allore restituirà una formattazione del messaggio, se è di un altro una formattazione diversa.
Ora, con questo codice ho avuto due utenti che hanno riscontrato problemi sull'auto refresh della chat, lamentando problemi al visualizzare i messaggi nuovi, proprio per questo mi interesserebbe un parere di "ottimizzazione" dell'applicazione. Posto parte del codice.
codice:
<script language="JavaScript" type="text/javascript">
var sendReq = getXmlHttpRequestObject();
var receiveReq = getXmlHttpRequestObject();
var lastMessage = 0;
var mTimer;
//Funzione che inizializza la chat
function startChat() {
//Setta il focus sul box di testo.
document.getElementById('txt_message').focus();
//Avvia la ricezione dei messaggi.
getChatText();
}
//Da le specifiche del browser su XmlHttpRequest
function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if(window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
} else {
document.getElementById('p_status').innerHTML = 'Status: Cound not create XmlHttpRequest Object. Consider upgrading your browser.';
}
}
//Mostra i messaggi ricevuti dal server
function getChatText() {
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
receiveReq.open("GET", 'getChat.php?chat=<?=$Stanza?>&last=' + lastMessage, true);
receiveReq.onreadystatechange = handleReceiveChat;
receiveReq.send(null);
}
}
//Invia i messaggi al server.
function sendChatText() {
if (sendReq.readyState == 4 || sendReq.readyState == 0) {
sendReq.open("POST", 'getChat.php?chat=<?=$Stanza?>&last=' + lastMessage, true);
sendReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
sendReq.onreadystatechange = handleSendChat;
var param = 'message=' + document.getElementById('txt_message').value;
param += '&tipo=' + document.getElementById('tipo_mex').value;
param += '&loca=' + document.getElementById('text_lcz').value;
param += '&chat=<?=$Stanza?>';
sendReq.send(param);
document.getElementById('txt_message').value = '';
}
}
//Se il messaggio è stato inviato correttamente aggiorna la pagina.
function handleSendChat() {
//Pulisce il time esistente per non avere istanze multiple in corso.
clearInterval(mTimer);
getChatText();
}
function handleReceiveChat() {
if (receiveReq.readyState == 4) {
//Incentra la ricezione dei messaggi e visualizzazione sul div
var chat_div = document.getElementById('div_chat');
var response = eval("(" + receiveReq.responseText + ")");
for(i=0;i < response.messages.message.length; i++) {
if (response.messages.message[i].tipo == '2') {
chat_div.innerHTML += '<fieldset><legend>Master Fato</legend><div class="master" title="' + response.messages.message[i].user + '"><center>' + response.messages.message[i].text + '</center></div></fieldset>';
chat_div.scrollTop = chat_div.scrollHeight;
} else if (response.messages.message[i].tipo == '3') {
chat_div.innerHTML += '<fieldset><legend>Moderazione</legend><div class="mod"><center>' + response.messages.message[i].text + '</center></div></fieldset>';
chat_div.scrollTop = chat_div.scrollHeight;
} else if (response.messages.message[i].tipo == '1') {
chat_div.innerHTML += '<fieldset><legend><font class="chat_time">' + response.messages.message[i].time + '</font>[img]' + response.messages.message[i].simbolo + '[/img]' + response.messages.message[i].user + '</legend><div class="azione">[' + response.messages.message[i].lcz + ']' + response.messages.message[i].text + '</div></fieldset>';
chat_div.scrollTop = chat_div.scrollHeight;
} else if ((response.messages.message[i].tipo == '4') && (response.messages.message[i].desti == '<?= $Login ?>')) {
chat_div.innerHTML += '<div class="susstu"><font class="chat_time">' + response.messages.message[i].time + '</font>' + response.messages.message[i].user + ' ti ha sussurrato:' + response.messages.message[i].text + '</div>';
chat_div.scrollTop = chat_div.scrollHeight;
} else if ((response.messages.message[i].tipo == '4') && (response.messages.message[i].user == '<?= $Login ?>')) {
chat_div.innerHTML += '<div class="susstu"><font class="chat_time">' + response.messages.message[i].time + '</font>' + response.messages.message[i].user + 'hai sussurrato a' + response.messages.message[i].desti + ':' + response.messages.message[i].text + '</div>';
chat_div.scrollTop = chat_div.scrollHeight;
}
lastMessage = response.messages.message[i].id;
}
mTimer = setTimeout('getChatText();',1000); //Aggiorna la pagina ogni 2 secondi
}
}
function blockSubmit() {
sendChatText();
return false;
}
function resetChat() {
if (sendReq.readyState == 4 || sendReq.readyState == 0) {
sendReq.open("POST", 'getChat.php?chat=<?=$Stanza?>&last=' + lastMessage, true);
sendReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
sendReq.onreadystatechange = handleResetChat;
var param = 'action=reset';
sendReq.send(param);
document.getElementById('txt_message').value = '';
}
}
function handleResetChat() {
document.getElementById('div_chat').innerHTML = '';
getChatText();
}
function getSusText() {
document.getElementById('txt_message').value = '@Destinatario@Testo';
}
</script>
</head>
<body onLoad="javascript:startChat();">
<div id="div_chat" style="height: 90%; width: 100%; overflow: auto; background-color: #C8B998;">
<form id="frmmain" name="frmmain" onSubmit="return blockSubmit();">
<input type="image" src="img/pulsanti/refresh.png" name="btn_get_chat" id="btn_get_chat" value="Refresh Chat" onClick="javascript:getChatText();" /><input type="image" src="img/pulsanti/descrizione.png" name="btn_get_desc" id="btn_get_desc" value="Descrizione Luogo" onClick="javascript:desc('descluogo.php?st=<?=$Stanza?>','Descrizione Luogo');">
<select name="tipo_mex" id="tipo_mex">
<option value="1">Normale</option>
<option value="4" onClick="javascript:getSusText();">Sussurro</option>
<? if ($_SESSION['master'] > '0') { ?>
<option value="2">Master</option>
<option value="3">Moderazione</option>
<? } ?>
</select><input type="text" id="text_lcz" title="Locazione" name="text_lcz" style="width:70px;">
<input type="text" id="txt_message" name="txt_message" style="width: 400px;" />
<input type="image" src="img/pulsanti/invia.png" name="btn_send_chat" id="btn_send_chat" value="Send" onClick="javascript:sendChatText();" />
<input type="image" src="img/pulsanti/pulisci.png" size="4" title="Pulisci Chat" name="btn_reset_chat" id="btn_reset_chat" value="P" onClick="javascript:resetChat();" />
</form>
Non so se può servire a questo punto anche la parte di codice php che da una risposta con json, nel caso lo posto ^^
Grazie comunque della disponibilità!