Warning: Parameter 1 to NP_TinyMCE2::event_PreSendContentType() expected to be a reference, value given in C:\HimeServer\www\micky\nucleus\libs\MANAGER.php on line 370
米其屁。北鼻的天空 - Ajax入門 - 第二課

Ajax入門 - 第二課

當網頁上發生事件時,瀏覽器可以執行一個函式,讓JavaScript存取該頁面中使用者所輸入的資訊。

常用的事件處理機制
onChange(改變一個欄位):任何時候,只要表單欄位有改變,onChange事件就會被觸發。
onFocus(進入一個欄位):不管是用TAB鍵的方式,或點擊滑鼠的方式,只要一個欄位取得焦點,則貼附在onFocus事件的JavaScript函式就會被執行。
onBlur(離開一個欄位):不管是用TAB鍵的方式,或點擊滑鼠的方式,只要使用者離開一個欄位,則貼附在onFocus事件的JavaScript函式就會被執行。




我們是透過DOM來取得我們所需要的資料
ex:
function getCustomerInfo(){
//使用DOM取得電話的資料
var phone = document.getElementById("phone").value;

//第一課學到的建立一個request
createRequest();

//escape()函式會將不合法的字元用其他方式代換,譬如說空白變成%20
var url = "lookupCustomer.php?phone=" + escape(phone);

//使用GET來發出請求
request.open("GET", url, true);
request.onreadystatchange = updatePage;

//單純的將請求送出
request.send(null);
}


參閱第一課的程式,請求物件的三種樣式
*new XMLHttpRequest(); :可以在Safari、FireFox、Mozilla、Opera、以及大部分非微軟的瀏覽器上運作。
*new ActiveXObject("Msxml2.XMLHTTP"); :大多數版本的IE所支援
*new ActiveXObject("Microsoft.XMLHTTP"); :有些版本的IE支援



解決JavaScript在使用者輸入時候才判斷要使用哪一種請求物件的樣式的錯誤,可以在網頁一開始載入的時候就決定好了。

JavaScript程式碼不一定要在函式內。將JavaScript的程式碼放在網頁的任何一個地方,當頁面載入時,此程式碼將會自動執行。

因此我們可以把createRequest()內的程式碼搬到網頁裡面,這樣一載入此頁面,就會建立好請求並且判斷是否支援了。

POST請求通常最適合用在涉及敏感資料(像是信用卡資料)或大量資料的請求上。一般會使用GET請求。

每次請求物件的備妥狀態一有改變,瀏覽器會去執行你的回呼函式。

備妥狀態儲存在readyState屬性中,共有以下值的變化:
0: 尚未初始化的連線
1: 已經初始化的連線
2: 處理中的回應
3: 取得伺服器回應
4: 伺服器的回應備妥了

因此我們先檢查備妥狀態,以確保請求已經被伺服器完成之後,才會對HTML做處理。

function updatePage(){
//確保請求的回應已經備妥
if(request.readyState == 4){
//瀏覽器已經將伺服器的回應放到物件的responseText屬性中
var customerAddress = request.responseText;
}
}

瀏覽器將伺服器的回應放在JavaScript請求物件中,讓我們的程式可以取得。

如果利用DOM對網頁做出修改,瀏覽器會立刻更新網頁。

在非同步應用中,次序很重要。要小心地安排欄位的次序,符合JavaScript程式碼的需求,這可以避免使用者產生困惑。

使用AJAX時,在IE發生的問題:
IE會對URL做快取,對於伺服端程式做出請求,IE會持續追蹤你所請求的URL。然後,如果你又對相同的URL發出請求(且資料也都一樣),IE就會認定你想得到相同的回應,所以IE不發出此請求,而是把上次請求的回應(存在快取區中)拿出來重複利用。Opera和IE一樣都會發出URL快取的問題。

解法:對於請求的URL做一點手腳,讓它每次都會是不一樣的請求URL。

譬如:
function getBoardsSold(){
createRequest();
var url = "getUpdatedBoardSales-ajax.php";
//加入了沒用的參數,讓IE以為每次都是不一樣的URL請求
url = url + "?dummy=" + new Date().getTime();
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);
}


使用DOM更新HTML顯示元素(像是<div>和<span>)的文字。
使用value屬性設定表單欄位元素(像是<input>和<textarea>)的文字。
« 前一篇 - 後一篇 »
---------------------------------------------

<%TrackBack(list)%>

迴響


謝謝唷!!

增加迴響

這篇文章已經關閉,不能增加迴響和投票