AJAX异步交互

小生初学阶段,若知识点不全和错误,还望各位大神指点!

一,基本内容

  1.异步交互:客户端向服务器端发送请求,直到服务器端进行响应,这个过程中,用户可以做任何其他事情(不需要等);
  2.AJAX——Asynchronous JavaScript and Xml  ;客户端与服务器端进行交互,而无需刷新当前页面的技术,称之为AJAX,实现的是B/S架构下的异步交互。
  3.在html中用到的<iframe src="">元素,嵌入一个网页,也是实现异步交互的技术。
  4.与同步交互的区别
     (1)同步交互:客户端向服务器端发送请求时,到服务器端进行响应,这个过程中,用户是不能做任何其他事情(只能等);
             *执行速度相对比较慢,响应的是完整的html页面。
       (2)异步交互

              *执行速度相对比较快,响应的是部分数据。

二,实现ajax的异步交互步骤

  1.创建XMLHttpRequest对象

function getXhr(){
 //声明XMLHttpRequest对象
 var xhr=null;
 //根据浏览器的不同情况进行创建
  if(window.XMLHttpRequest){
    //表示除IE外的其他浏览器
    xhr=new XMLHttpRequest();
}else{
//表示ie浏览器(8及以前版本)
    xhr=new ActiveXobject('Microsoft.XMLHttp');
}
 return xhr;
}


   此对象特别重要,建议记住!

  2.与服务器端建立连接
    *使用XMLHttpRequest对象的 open(method,url)方法
       *method——设置当前请求的类型

       *url——设置当前请求的地址

  3.向服务器端发送请求
      *使用XMLHttpRequest对象的 send(请求参数)方法

         *请求参数的格式——key=value

  4.接收服务器端的响应数据
      (1)使用XMLHttpRequest对象的 onreadystatechange事件,监听服务器端的通信状态。
      (2)使用XMLHttpRequest对象的 readyState属性,判断服务器端的当前状态(0-4)。
             *0——(服务器端)尚未初始化
             *1——(服务器端)正在接收
             *2——(服务器端)接收完毕
             *3——(服务器端)正在响应
             *4——(服务器端)响应完毕
      (3)使用XMLHttpRequest对象的 status属性,判断服务器端的状态码(200)。

      (4)使用XMLHttpRequest对象的responseText属性,接收服务器端的响应数据。

 注意:上述2中method参数有get与post,两种请求类型不同,写法也就不同

       **GET请求方式:
          *send()方法不起作用,但是不能被忽略! xhr.send(null);
          *请求参数——添加到 URL?key=value;
          *get请求类型案例:
              html页面代码:
<!DOCTYPE html>
<html>
 <head>
  <title>实现Ajax异步交互</title>
  <meta charset="utf-8" />
 </head>

 <body>
  <input type="button" value="异步请求" id="btn">
  <script>
 // 实现Ajax的异步交互的步骤

 var btn = document.getElementById("btn");
 btn.onclick = function(){
  /*
   * 1. 实现Ajax主要依靠XMLHttpRequest对象
   * * 创建XMLHttpRequest对象
   */
  var xhr = getXhr();
  /*
   * 2. 与服务器端建立连接
   */
  xhr.open("get","01.php?user=zhangwuji");
  /*
   * 3. 客户端向服务器端发送请求
   */
  xhr.send(null);
  /*
   * 4. 客户端接收服务器端的响应
  */
  xhr.onreadystatechange = function(){
   // 保证服务器端响应的数据发送完毕
   if(xhr.readyState == 4){
    // 保证这次请求必须是成功的
    if(xhr.status == 200){
     // 接收服务器端的数据
     var data = xhr.responseText;
     // 测试
     console.log(data);
    }
   }
  }
 }
 // 定义创建XMLHttpRequest对象的函数
 function getXhr(){
  // 声明XMLHttpRequest对象
  var xhr = null;
  // 根据不同浏览器创建
  if(window.XMLHttpRequest){
   // 其他浏览器
   xhr = new XMLHttpRequest();
  }else{
   // IE浏览器(8及之前)
   xhr = new ActiveXObject("Microsoft.XMLHttp");
  }
  // 返回XMLHttpRequest对象
  return xhr;
 }
  </script>
 </body>
</html>


           php页面代码:
  
<?php
 // 用于处理客户端的Ajax异步请求
 // 1. 接收客户端发送的请求数据
 $user = $_GET['user'];
 // 2. 向客户端进行响应
 echo $user.' get request succesful.';
?>


        **POST请求方式:
           *在send方法被调用前,使用 setRequestHeader()方法设置请求头信息

               固定写法:xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");

              POST方式请求案列:

                 html页面代码:
             
<!DOCTYPE html>
<html>
 <head>
  <title>POST方式的Ajax</title>
  <meta charset="utf-8" />
 </head>

 <body>
  <input type="button" value="异步" id="btn">
  <script>
 var btn = document.getElementById("btn");
 btn.onclick = function(){
  // 实现Ajax的异步交互
  var xhr = getXhr();
  xhr.open("post","02.php");
  /*
   * 如果Ajax使用的是POST请求类型的话
   * * 必须要在send()方法调用之前
   * * 使用setRequestHeader(key,value)方法
   * * 该方法用于设置请求头
   */
  xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

  xhr.send("user=zhangwuji");
  xhr.onreadystatechange = function(){
   if(xhr.readyState == 4){
    if(xhr.status == 200){
     var data = xhr.responseText;
     console.log(data);
    }
   }
  }
 }
 function getXhr(){
  var xhr = null;
  if(window.XMLHttpRequest){
   xhr = new XMLHttpRequest();
  }else{
   xhr = new ActiveXObject("Microsoft.XMLhttp");
  }
  return xhr;
 }
  </script>
 </body>
</html>


             php页面代码:
<?php
 // 1. 接收客户端发送的请求
 $user = $_POST['user'];
 // 2. 进行响应
 echo $user.' post request successful.';
?>


综合案例:使用ajax实现省市/区二级联动

html代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>二级联动全ajax实现</title>
</head>
<body>
<select id="shengji">
	<option>-请选择-</option>
</select>
<select id="city">
	<option>-请选择-</option>
</select>
<script>
	function getXhr(){
	var xhr=null;
	if(window.XMLHttpRequest){
	  xhr=new XMLHttpRequest();
	}
		else{
			xhr=new ActiveXObject("Microsoft.XMLHttp");
		}
		return xhr;
	}//创建XMLHttpRequest对象
	var xhr=getXhr();
	var shengji=document.getElementById("shengji");
	var city=document.getElementById("city");
	window.onload=function(){//页面加载完执行
		xhr.open("get","ajaxejld2.php?status=1");
		xhr.send(null);
		xhr.onreadystatechange=function(){
			if(xhr.readyState==4&&xhr.status==200){
				var data=xhr.responseText;
				var province=data.split(",");
				for(var i=0;i<province.length;i++){
				  var option=document.createElement("option");
				  option.innerHTML=province[i];
				   shengji.appendChild(option);
				}
			}
		}
		
	}
	
	shengji.onchange=function(){//第一个select发生改变时执行
		var opts=city.getElementsByTagName("option");
		for(var j=opts.length-1;j>0;j--){
			city.removeChild(opts[j]);//先清空第二个select元素
		}
		if(shengji.value!="-请选择-"){
		xhr.open("post","ajaxejld2.php");
		xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		xhr.send("status=2&province="+shengji.value);
		xhr.onreadystatechange=function(){
			if(xhr.readyState==4&&xhr.status==200){
				var data=xhr.responseText;
				var citys=data.split(",");
				for(var i=0;i<citys.length;i++){
					var option=document.createElement("option");
					option.innerHTML=citys[i];
					city.appendChild(option);
					
				}
				
			}
			
		}
	}
	}
</script>
</body>
</html>

php页面代码:

<?php
$status=$_REQUEST['status'];
if($status==1){
	echo'重庆市,北京市,天津市,河北省';
}else{
  $province=$_POST['province'];
    switch($province){
		case '重庆市':
			echo'渝中区,渝北区,沙坪坝区,九龙坡区,两江新区,北碚区';
			break;
		case '北京市':
			echo'东城区,西城区,海淀区,朝阳区';
			break;
		case '天津市':
			echo'河东区,河西区,南开区';
			break;
		case '河北省':
			echo'石家庄市,廊坊市,保定市,唐山市,秦皇岛市';
			break;
	}
}

?>
注:上述中数据的格式为HTML(文本格式),ajax数据格式还有XML,json;这只是原生js的操作,还可以用jquery操作,使其更加简单,后面再续写。 点击打开链接









猜你喜欢

转载自blog.csdn.net/weixin_42026831/article/details/80208217