AJAX 入門:第五個範例
The following examples had been tested on Mozilla's Firefox and Microsoft's IE. The document is provided as is. You are welcomed to use it for non-commercial purpose.Written by: 國立中興大學資管系呂瑞麟
請勿轉貼
看其他教材
這個範例跟第四個範例非常類似,主要不同的地方在於這次我們增加了一個使用 XMLHttpRequest 的地方,也就是選擇了 XML 檔案後,AJAX 會要求 server 將解析 之後的結果回傳;最後,AJAX 網頁將回傳的內容放置於如網頁中綠色的方塊中 (這效果是採用 CSS 的結果)。請參考 demo 網站。
範例說明:
- 在這個範例中,我們在"範例說明:"之後,加了一段 div 區塊,其內容如下,
這個區塊也就是右邊綠色的方塊,該方塊的 id 為 rssBox:
<div id="rssBox" class="on"> </div>
#rssBox { width:350px; margin:5px; float:right; height:220px; border:1px dotted #317082; padding:3px; font-size:0.8em; background-color:#99FF99; overflow-x: scroll; overflow-y: scroll; }
- HTML 元件的部份有一個地方跟第四個範例不同的地方我們需要特別說明一下,
先列示其原始碼如下:
<form name="myform"> 請選擇: <input type="radio" name="xml" value="url" onClick="callServer();">自行輸入網址</input> <input type="radio" name="xml" value="xml" onClick="callServer();">選擇現有的 XML 檔</input> <br/> <div id="label" class="on"> </div> </form>
<input type="submit" value="確定">
<input type="button" value="確定" onClick="dispXML();">
- 大部分 dispXML() 程式碼跟之前的 AJAX 程式大同小異,我們只針對需要說明的
地方描述。如以下程式碼所示,首先是定義事件處理函數為 showXML(),這是因為在
這個網頁的其他 AJAX 呼叫已經使用了 alertContents()(也就是說,本範例定義了
兩個事件處理函數;能定義兩個事件處理函數,自然可以定義更多的事件處理函數),
而其內容與這次的處理方式不同,所以我們必須定義另一個事件處理函數。
01 // 定義事件處理函數為 showXML() 02 http_request.onreadystatechange = function() { 03 showXML(http_request); }; 04 // 由於 radio button 有一個以上,所以一般都是以陣列的方式處理 05 // 只是這個範例只有兩個,所以就簡單的用 if 來解決 06 var option; 07 if(document.myform.xml[0].checked) 08 option = document.myform.xml[0].value; 09 else 10 option = document.myform.xml[1].value; 11 var url = "/jlu/servlet/DOMBox?xml=" + option + 12 "&file=" + document.myform.file.value; 13 http_request.open('GET', url, true); 14 http_request.send(null);
function display() { document.getElementById("label").innerHTML = '請輸入網址:' + '<input type="text" name="file"></input><input type="button" value="確定" onClick="dispXML();"></input>'; document.getElementById("rssBox").innerHTML = ''; }
- 由於 DOMBox.java 執行的方式是把使用者指定的 XML 檔案打開,然後一次
讀一行,然後再一行一行的送到 AJAX 網頁,因此我們在 showXML() 中必須把從
server 收到的 < 轉換成 <、 > 轉換成 >、以及換行的特殊
字元轉換成 <br/>。showXML() 的程式碼如下:
var restext; function showXML(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { restext = http_request.responseText; // 將 <> 轉換成 < > var regex = new RegExp("<", "gi"); restext = restext.replace(regex, "<"); regex = new RegExp(">", "gi"); restext = restext.replace(regex, ">"); regex = new RegExp("\n", "gi"); restext = restext.replace(regex, "<br/>"); document.getElementById("rssBox").innerHTML = restext; //alert(http_request.responseText); } else { alert('There was a problem with the request.'); } } }
RegExp 是一個 Javascript 的類別,它提供了 regular expression 的功能; 依據 Wiki 的定義,regular expression 是一種表示式(expression),而該 表示式可以用來尋找符合某一定格式(pattern)的文字集合。例如,假設某一個 文字檔中包含了 "this is a book" 的文字,如果 regular expression 表示要找尋 "is" 文字,那麼總共有兩個 "is" 被找到,如文字中的 綠色字體所示。regular expression 是一個功能非常強大的機制,許多高階 語言都支援該項特色,至於進一步的學習不在本文件的範圍內,所以就不再 多談。 - 完整原始碼:
function display() { // 顯示文字欄位 document.getElementById("label").innerHTML = '請輸入網址:' + '<input type="text" name="file" size="40"></input><input type="button" value="確定" onClick="dispXML();"></input>'; document.getElementById("rssBox").innerHTML = ''; } function callServer() { document.getElementById("rssBox").innerHTML = ""; var http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Giving up :( Cannot create an XMLHTTP instance'); return false; } // 定義事件處理函數為 alterContents() http_request.onreadystatechange = function() { alertContents(http_request); }; var url = "/jlu/servlet/retFiles"; http_request.open('GET', url, true); http_request.send(null); } function alertContents(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { var restext = http_request.responseText.split("|"); var mesg = '<select name="file">'; for(var i=0; i<restext.length-1; i++) { mesg += '<option value="' + restext[i]; if(i == 0) mesg += '" selected="1">'; else mesg += '">'; mesg += restext[i] + '</option>'; } mesg += '</select>'; mesg += '<input type="button" value="確定" onClick="dispXML();"></input>'; document.getElementById("label").innerHTML = mesg; } else { alert('There was a problem with the request.'); } } } function dispXML() { document.getElementById("rssBox").innerHTML = "Loading..."; var http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari,... http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (!http_request) { alert('Giving up :( Cannot create an XMLHTTP instance'); return false; } http_request.onreadystatechange = function() { showXML(http_request); }; var option; if(document.myform.xml[0].checked) option = document.myform.xml[0].value; else option = document.myform.xml[1].value; var url = "/jlu/servlet/DOMBox?xml=" + option + "&file=" + document.myform.file.value; http_request.open('GET', url, true); http_request.send(null); } var restext; function showXML(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { restext = http_request.responseText; var regex = new RegExp("<", "gi"); restext = restext.replace(regex, "<"); regex = new RegExp(">", "gi"); restext = restext.replace(regex, ">"); regex = new RegExp("\n", "gi"); restext = restext.replace(regex, "<br/>"); document.getElementById("rssBox").innerHTML = restext; } else { alert('There was a problem with the request.'); } } }
Written by: 國立中興大學資管系呂瑞麟
網誌管理員已經移除這則留言。
回覆刪除