直接看源碼
代碼如下 |
複製代碼 |
<script language="javascript"> function setViewPoint() { var msg =""; //用於接收返回資料 //執行個體化Ajax var leeAjax = leeInitAjax(); var webRoot = window.location; webRoot = webRoot.toString(); var domain = webRoot.substring(7); var endD = domain.indexOf("/"); domain = domain.substring(0,endD); //接收表單的URL地址 var url = "http://"+domain+"/plus/leeGetViewForWay.php"; //通過Post方式開啟串連 leeAjax.open("POST", url, true); //定義傳輸的檔案HTTP頭資訊 leeAjax.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk"); //需要POST的值,把每個變數都通過&來聯結 //發送POST資料 var postStr = "viewId='asdf'&id='asdfa'" leeAjax.send(postStr);//擷取執行狀態 leeAjax.onreadystatechange = function() { //如果執行狀態成功,那麼就把返回資訊寫到指定的層裡 if (leeAjax.readyState == 4 && leeAjax.status == 200) { msg = leeAjax.responseText;//擷取的傳回值 alert(msg); } } } function leeInitAjax() { var leeAjax=false; try{ if( window.ActiveXObject ){ for( var i = 5; i; i-- ){ try{ if( i == 2 ){ leeAjax = new ActiveXObject( "Microsoft.XMLHTTP" ); } else { leeAjax = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" ); } break; } catch(e) { leeAjax = false; } } } else if( window.XMLHttpRequest ) { leeAjax = new XMLHttpRequest(); if (leeAjax.overrideMimeType) { leeAjax.overrideMimeType('text/xml'); } } } catch(e) { leeAjax = false; } return leeAjax; } </script> |
php 代碼如下:
代碼如下 |
複製代碼 |
<?php $a = $_REQUEST ["viewId"].")___(".$_REQUEST["id"]; if($_POST ["viewId"]=="") $a .= "<br/>___"; echo $a; ?> |
於是在構建發送資料時由字串改成了JS對象,可是還是不行。只好查資料了。原來是要設定一下發送資料的編碼類別型的。代碼如下:
代碼如下 |
複製代碼 |
var Myquery = Myinput(); xmlhttp.open("POST","post.php",true); xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xmlhttp.onreadystatechange = byphp;
|
xmlhttp.send(Myquery);application/x-www-form-urlencoded編碼類別型是表單發送資料的預設編碼類別型,想不到在AJAX請求中要明確註明,這樣添加了第三行的代碼註明格式後果然就正確了,問題解決。如果通過JQUERY發送POST方式的AJAX請求就方便多了,不用添加這一行。再一次感受到了JQUERY的強大和便捷。
想用POST發送Ajax非同步請求,就要把你的資料統一放在send()方法中發送,而不能是send(null)。
代碼如下 |
複製代碼 |
Xml.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); |
這一句在GET方式中不要寫,但是在POST方式中是必須的,由於你在POST方式中用了send(null),導致沒有發送任何資料到index1.php,所以看不到這一句的效果。
代碼如下 |
複製代碼 |
get('index1.php?c=1',a)" get('index1.php?c=2',a)" |
兩個按鈕發送的資料只有c這個參數不同,所以可以把index1.php和a都寫在你這個get方法的內部,修改以後的get方法是這樣的
代碼如下 |
複製代碼 |
function get(num) { data="index1.php?"; if(Xml){ var obj=document.getElementById("a"); Xml.open("POST",data); Xml.onreadystatechange=function() { if(Xml.readyState==4&&Xml.status==200){ obj.innerHTML=Xml.responseText; } } Xml.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); var queryString="c="+num; Xml.send(queryString); } } |
當然
代碼如下 |
複製代碼 |
get('index1.php?c=1',a)" get('index1.php?c=2',a)" 也要相應的改成 get(1); get(2); |
這樣就可以成功地用POST方法向伺服器非同步請求資料了