AJAX傳值技巧--"php://input"的特殊文件

AJAX我相信不用我多說,大家都知道是什麼東西吧。我接觸AJAX也不算太久,都是邊學邊寫東西。其中遇到了很多問題,也總結了很多經驗。我不是高手,所以我不敢說我的東西是最好的,如果你有更好的,歡迎一起討論。
首先我覺得AJAX新手不應一以來就用什麼框架(比如prototype.js等,即使那樣寫程序會容易一些)。原因是瞭解xmlhttp的基本工作原 理,對以後的開發會有很大的幫助。而且我始終覺得對於Javascript這種腳本語言來說,執行效率是非常重要的,因此我十分反感爲了實現一個小功能, 動不動就包含什麼框架。因爲那些框架爲了自身的功能和兼容性,都包含了很多使用頻率比較低的東西,更有些框架爲了方便用戶調用,甚至不惜犧牲程序的執行效 率。
好了,不說廢話了,開始說正題吧。
1.創建xmlhttp對象時的問題。
創建xmlhttp對象在不同的瀏覽器中有不同的方法,在IE裏好像只能用ActiveXObject創建,然而在Firefox等其他瀏覽器裏就不行了,但可以用XMLHttpRequest()函數創建,這樣的不統一給程序員寫程序帶來了很大的難度,所以我認爲在學習JS的過程中記錄下這些不同的地方很有必要,不然一個很有前途的程序很容易就會成爲 "IE only" 的!!
下面是一個兼容的xmlhttp對象創建函數。以後就可以直接用這個函數創建xmlhttp對象,而不用擔心兼容性問題了
CODE:
function createAJAX()
{
var xmlhttp;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e1)
{
try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e2) { xmlhttp = null; }
}
if (!xmlhttp)
{
if (typeof XMLHttpRequest != "undefined") { xmlhttp = new XMLHttpRequest(); }
else return false;
}
return xmlhttp;
}

2.AJAX的數據傳輸方式。
正如你知道的,AJAX支持以POST何GET方式傳送數據。但你知道怎樣正確使用他們嗎?
GET:
GET是最常用的數據傳輸方式,就是將變量名和值直接跟在URL後面就可以了,同時這個也是最簡單的方法。
比如: 調用的URL爲 ajax.php?id=1,這樣在ajax.php中的$_GET數組裏就有 $_GET["id"] = 1; 如果有多個變量,則用"&"分開。
POST:
POST相對於GET來說要用得比較少一點,而且POST的用法比GET要麻煩一點。
首先,POST也跟GET一樣,要先把變量名和值用"="和"&"符號連成一個字符串。 然後用 xmlhttp的 send 方法傳送。而且要在send之前設置header。
CODE:
var ajax = createAJAX(); //就是前面那個創建xmlhttp對象的函數
ajax.open("POST","ajax.php",true);
ajax.onreadystatechange = function1; //配置狀態處理函數名,不能在後面加上"()"!!
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //這句必須要,而且一定要放在send以前
ajax.send("變量1=值1&變量2=值2");

用這種方法傳送出去的值就和用表單的post方式傳出的值一樣。

還有一個非常重要的,不管用POST還是GET,都應特別注意"&","+"和"%"等特殊字符的問題。如果變量的值裏面含有這些字符,那麼後果 不堪設想。一個很好地解決辦法就是使用encodeURIComponent這個全局函數來將所有的值都處理一遍(注意只是處理值),將特殊字符轉換成% XX的形式(和php裏的urlencode貌似是一個功能)。但這個函數在IE5裏不能用!

用POST方法傳送數據的時候,xmlhttp.send()傳出的所有東西在php裏都可以在一個名叫"php://input"的特殊文件裏讀取到。 比如上面的那個代碼,在ajax.php裏用 file_get_contents("php://input") 就可以得到 "變量1=值1&變量2=值2"。 這是一個非常好的功能!這樣我們就可以不用再使用"變量名=值"的方式了!也不用擔心特殊字符! 將這個方法和GET結合起來就可以做一個AJAX的文章自動保存的程序。
CODE:
var ajax = createAJAX();
ajax.open("POST","ajax.php?filename=a.txt",true);
ajax.onreadystatechange = function1;
//ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); //如果不需要將send出的字符串解析成POST變量數據,那麼這句就可以不用了
ajax.send("這裏可以傳送文件正文!!!!!");

這樣從ajax.php的$_GET數組中可以獲得文件名,用 file_get_contents("php://input") 就可以獲得文件正文,而且不用擔心任何的特殊字符,同時也不用處理數據,減輕客戶端壓力。
我做了一個樣例,看這裏 http://longbill.cn/down/sample/ajax.htm

我看過很多ajax框架,但沒有發現支持用這種方式傳輸數據的。另外我發現一個非常好用的ajax框架 tw-sack.js,但也有許多不盡人意的地方。於是我修改了一下,增加了一些功能。下面說說它的功能和用法:

特點:
體積小,方便調用, 增加 GET&POST 方法,就是上面說的那種
CODE:
實體化對象:
var ajax = new sack("URL"); // URL爲ajax調用地址

屬性:( =默認值)
method = "GET"; //"GET"和"POST"或"GET&POST"
encodeURL = true; //是否處理參數值
late = true; //是否爲異步方式
函數配置:
onLoading = 空函數; //當loading的時候觸發
onLoaded = 空函數; //當下載完的時候觸發
onInteractive = 空函數; //當交互的時候觸發
onCompletion = 空函數; //當全部完成的時候觸發
onError = 空函數; //當發生錯誤的時候觸發
方法:
setVar 設置變量和值,可以以兩種方式:setVar("varName","varValue"); 和 setVar( { "name1":"value1","name2":"value2"} );
send 發送,可以當method = "GET&POST" 的時候可以接受一個字符串作爲 POST 的內容
當完成的時候纔可用的屬性(在onCompletion裏可以使用):
response //返回的字符串
responseXML //返回的xml

具體樣例:
ajax.htm:
CODE:
<div id='mydiv'>Loading...</div>
<script src='sack.js'></script>
<script>
var ajax = new sack("ajax.php");
ajax.method = "GET&POST";
ajax.setVar(
{
"action":"read",
"my":"posttdfsfdsfafasd"
});
ajax.onCompletion = function ()
{
document.getElementById('mydiv').innerHTML = ajax.response;
}

ajax.send("這裏是POST出去的內容,可以有特殊字符&=等");
</script>

ajax.php:
CODE:
&lt;?
$br = "<br/>---------------------------<br/>";
print_r($_GET);
echo $br;
print_r($_POST);
echo $br;
echo file_get_contents("php://input");
echo $br;
?&gt;
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章