簡介
本篇小專案記錄了如何運用所學的AJAX來做到聊天室的功能,這次專案我主要是Focus在”傳訊功能”上,至於聊天室其他的功能,像是登入系統、傳訊時間、傳訊人ID顯示等等,這些都不是本專案要做的重點,所以程式碼會顯得簡單一些,希望這樣大家也比較容易掌握到重點。建議讀者先看過我整理的AJAX課程筆記會比較快理解本篇的程式碼。內文
那麼我們就先來看看HTML簡單的設計吧,如下:<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type = "text/javascript" src = "ChatRoom.js"></script>
</head>
<body onload="process()">
<div id = "ShowPanel" style="width:800; height:480; border-style: solid; border-width: 1px; overflow:scroll;" >
</div>
<input type="Text" placeholder="文字輸入欄" id = "TextInput" style="position:absolute; left:10; top:550;">
<input type="submit" value = "傳送" onclick = "sendprocess()" style="position:absolute; left:170; top:550;">
</body>
</html>
結果
接著,我們將所學課程的XML內文也稍微改了一下,如下:
<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
$text = $_GET['TextInput'];
$file = fopen('TextFileName.txt','a');
if(!empty($text)){
fwrite($file,$text." ");
}
fclose($file);
echo '<response>';
$read = file('TextFileName.txt');
foreach($read as $text){
if(!empty($text)){
echo $text;
}
}
echo '</response>';
?>
簡單說明一下,XML的內文除了取得我們從TextInput欄位輸入的文字之外,也會寫入到我們自己新增的文字檔內(請新增一個文字檔在同一個目錄下,檔名可自行取名),且每次新寫入的文字都以”(空格)”隔開。接著再讀取文字檔內的內文,將它供給JS取回顯示。
接著JS要處理的內容有哪些呢?主要分成兩個部分,一個是週期性的去取回文字檔內的寫入內容並顯示,另一個則是當按下傳送鈕時,只做一次性的處理(寫入並顯示)。那麼,我們就來看看JS的程式碼吧!如下:
var xmlHttp = createXmlHttpRequestObject();
function createXmlHttpRequestObject(){
var xmlHttp;
if(window.ActiveXObject){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
xmlHttp = false;
}
}else{
try{
xmlHttp = new XMLHttpRequest();
}catch(e){
xmlHttp = false;
}
}
if(!xmlHttp)
alert("Cant create that object !")
else
return xmlHttp;
}
function process(){
if(xmlHttp.readyState==0 || xmlHttp.readyState==4){
xmlHttp.open("GET", "ChatXML.php",true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
}else{
setTimeout('process()',1000);
}
}
function handleServerResponse(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
xmlResponse = xmlHttp.responseXML;
xmlDocumentElement = xmlResponse.documentElement;
message = xmlDocumentElement.firstChild.data;
message = message.replace(/ /g,"<br/>");
document.getElementById("ShowPanel").innerHTML = message;
setTimeout('process()', 1000);
}
else{
alert('Someting went wrong !');
}
}
}
function sendprocess(){
if(xmlHttp.readyState==0 || xmlHttp.readyState==4){
text = encodeURIComponent(document.getElementById("TextInput").value);
xmlHttp.open("GET", "ChatXML.php?TextInput="+text,true);
xmlHttp.onreadystatechange = sendhandleServerResponse;
xmlHttp.send(null);
}else{
setTimeout('sendprocess()',1000);
}
}
function sendhandleServerResponse(){
if(xmlHttp.readyState==4){
if(xmlHttp.status==200){
xmlResponse = xmlHttp.responseXML;
xmlDocumentElement = xmlResponse.documentElement;
message = xmlDocumentElement.firstChild.data;
message = message.replace(/ /g,"<br/>");
document.getElementById("ShowPanel").innerHTML = message;
}
else{
alert('Someting went wrong !');
}
}
}
process()函式是從課程筆記”[AJAX] Lesson 3 - 使用JS即時更新版面“修改而得,在這裡主要處理的就是週期性的去從XML取回文字檔內的內容,而handleServerResponse()函式就是把取得的資料顯示出來,這裡要注意的是.replace(),由於XML每次新寫入的文字都是以空格格開,因此必須用此函式來將空格用
(換行指令)來取代。至於傳送紐的觸發事件函式就是sendprocess()和sendhandleServerResponse(),其處理內容跟上述及課程筆記裡都可以輕易理解,我就不再多說明了。
點我看結果
留言
張貼留言