XMLHTTP

tonyscau發表於2008-05-22
xmlhttp是一種瀏覽器物件, 可用於模擬http的get和post請求。配合javascript可以實現頁面資料在無重新整理下的定時資料更

新,如果應用在聊天室、文字直播上可以取得較好的視覺效果。

ie中的 xmlhttp物件

在ie中xmlhttp被實現為activex物件,通常使用

var xmlhttp = new activexobject("msxml2.xmlhttp");

來建立一個物件,然後使用該物件的open方法來發出一個http請求。

xmlhttp.open("get", fragment_url);

這時候瀏覽器已經發出了http請求,我們需要註冊一個匿名函式給xmlhttp物件的onreadystatechange方法,這樣當請求返回

時,xmlhttp就會自動呼叫我們註冊的這個函式,下邊是一個實際的例子。

xmlhttp.onreadystatechange = function()

{

if (xmlhttp.readystate == 4 && xmlhttp.status == 200)

{

element.innerhtml = xmlhttp.responsetext;

}

}

因為我們不需要再傳送任何資訊,所以用下邊的語句結束

xmlhttp.send(null);

我們將上邊的過程封裝為一個函式,下邊是這個函式的完整程式碼:

function loadfragmentintoelement(fragment_url, element_id)

{

var element = document.getelementbyid(element_id);

var xmlhttp = new activexobject("msxml2.xmlhttp");

xmlhttp.open("get", fragment_url);

xmlhttp.onreadystatechange = function()

{

if (xmlhttp.readystate == 4 && xmlhttp.status == 200)

{

element.innerhtml = xmlhttp.responsetext;

}

}

xmlhttp.send(null);

phpmore vol5 24/26

}

函式的呼叫方法如下所示:

loadfragmentintoelement( , dynamiccontent_id );

有了上邊的程式碼, 再配合javascript的定時函式, 我們就可以實現定時的無重新整理資料更新了, 下邊這個函式每隔5秒對element_id

的資料進行一次更新。

function refresh( element_id )

{

loadfragmentintoelement( show.php , + element_id );

settimeout( "refresh(ts)" , 5000 );

}

在 ie上使用xmlhttp要注意的問題

特別要注意的是由於ie的cache的關係,我們看見的xmlhttp並不總是最新讀取的那一個,為了讓ie不啟用cache,我們傳送給

ie一個特殊的header,用php實現如下:

header( "expires: mon, 26 jul 1997 05:00:00 gmt" );

header( "last-modified: " . gmdate( "d, d m y h:i:s" ) . "gmt" );

header( "cache-control: no-cache, must-revalidate" );

header( "pragma: no-cache" );

xmlhttp物件在gecko上的實現

gecko上的xmlhttp和ie上略有不同,它並不需要透過activex來建立。另外回撥函式必須在open方法之前註冊,而ie並不要

求,這是一個很需要注意的問題。

使用javascript實現xmlhttp的跨瀏覽器應用

為了能在多種瀏覽器上有一個統一的實現, 我們可以用javascript來對不同瀏覽器的差異進行封裝。 這裡我們採用andrew gregory

的實現。首先我們要引用andrew gregory的一個名為xmlhttprequest.js的js指令碼。

然後在建立xmlhttp物件時統一使用new xmlhttprequest()就可以了; 其它的方法不用改變。 這個js指令碼執行我們在ie、 gecko

(mozilla/firefox) 和opera的特定版本使用xmlhttp。下邊是調整後的loadfragmentintoelement函式, 這個函式在ie6

和firefox1.0pre上執行透過。

xmlhttprequest.js檔案和具體的使用例子可以在我寫的一個demo中找到。

xmlhttp中的中文亂碼問題

在預設情況下,xmlhttp都是使用utf-8字符集,而我們使用的多是gb2312字符集,這就要求我們進行gb2312到utf-8的轉碼。

php提供了一個可選的專碼模組,可以實現多種字符集之間的相互轉化。載入這個專碼模組的方法如下:

開啟 php 配置檔案 php.ini,將 ;extension=php_mbstring.dll(*nix 是 php_mbstring.so) 前的分號去掉。重新啟動

apache以後,這個模組就可以使用了。如果有錯誤出現,請檢查擴充套件目錄的路徑設定是否正確。

載入這個模組以後,我們就可以使用mb_convert_encoding函式來轉碼了:

$utf8_string = mb_convert_encoding( $gb_string , utf-8 , gb2312 );
將轉碼後的字元輸出就可以看見正確顯示的中文[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7558084/viewspace-1004411/,如需轉載,請註明出處,否則將追究法律責任。