您的位置:首页 > 理论基础 > 计算机网络

ajax第一课(XMLHttpRequest向后台传字符串)

2016-12-22 12:51 288 查看
这是我第一个与ajax有关的程序。用的是原生的js写的。遇到了不少问题,对此进行总结。代码如下:

1.html

<input type="text" onchange="sub()"/>
<script>
function httpRequest(reqType,url,asynch,respHandle){
if(window.XMLHttpRequest){
request = new XMLHttpRequest();
}else if(window.ActiveXObject){
request = new ActiveXObject("Msxml2.XMLHTTP");
if(!request){
request=new ActiveXObject("Microsoft.XMLHTTP");
}
}
if(request){
//alert(request);执行了
if(reqType.toLowerCase()!='post'){
initReq(reqType,url,asynch,respHandle);
}else{
var args=arguments[4];
//alert(args);执行了
if(args!=null && args.length>0){
initReq(reqType,url,asynch,respHandle,args);
}
}
}else{
alert("your browers not permit");
}
}
function initReq(reqType,url,bool,respHandle){
//alert(respHandle);
//alert(handleResponse);
try{
request.open(reqType,url,bool);
request.onreadystatechange=respHandle;//如此出写的respHandle是字符串,则无法响应
//alert("start2");
if(reqType.toLowerCase()=='post'){
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
var arg=arguments[4];
request.send(arg);
//alert("star3");
}else{
request.send(null);
}
}catch(errv){
alert("The aplication cannot contact");
}

}
function handleResponse(){
//alert("wo wo ");
if(request.readyState==4){
//alert('yes1');
if(request.status==200){
alert(request.responseText);
}else{
alert("have a problem");
}
}
}
function setSearchString(){
var e=document.getElementsByTagName('input')[0];
str=e.value;
httpRequest('POST',"1.php",true,handleResponse,str);
}
function sub(){
  setSearchString();
}
</script>


1.php
<?php
//echo $_POST['arg'];此做法只是适用于传过来的数据为变量名+变量值
echo $GLOBALS['HTTP_RAW_POST_DATA'];
echo file_get_contents("php://input");
 ?>

需要注意的几点:
1.request.onreadystatechange=respHandle;//首先这里的respHandle是一个函数对象,而不能是简单的函数名(字符串)。

2.一般我们都用$_POST或$_REQUEST两个预定义变量来接收POST提交的数据。但如果提交的数据没有变量名,而是直接的字符串,则需要使用其他的方式来接收。

方法一: 使用全局变量$GLOBALS['HTTP_RAW_POST_DATA']来获取。

如果出现undefined HTTP_RAW_POST_DATA,怎需要在php.ini中设置 always_populate_raw_post_data = On。

在$GLOBALS['HTTP_RAW_POST_DATA']存放的是POST过来的原始数据。而$_POST或$_REQUEST存放的是PHP以key=>value的形式格式化以后的数据。但$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时必须显式示指明Content-Type:
application/x-www-form-urlencoded,POST的数据才会存放到 $GLOBALS['HTTP_RAW_POST_DATA']中。

方法二: 使用file_get_contents("php://input")来获取。

     对于未指定 Content-Type 的POST数据,则可以使用file_get_contents("php://input");来获取原始数据。事实上,php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: