Ajax学习总结(二):Ajax返回响应的数据格式+onreadystatechange 事件+省市联动案例

Ajax返回响应的数据格式:

获取服务器响应使用XMLHTTPRequest对象的两种方法,其返回的文件格式不同:

  1. responseText(获得字符串类型的响应数据,即HTML格式)
  2. responseXML(获得xml文件的响应数据)

返回HTML格式的优点:

  • 在浏览器端无需JavaScript解析
  • 可读性好
  • 与innerHTML搭配效率高

缺点:

  • 若需要更新页面的多个地方则多次返回HTML文档不合适
  • innerHTML并非DOM标准

这时便体现出返回XML文档类型的优越性。XML设计的初衷就是用来传输和存储数据。

onreadystatechange 事件:

当请求被发送到服务器时,我们需要执行一些基于响应的任务。

每当 readyState 改变时,就会触发 onreadystatechange 事件。

readyState 属性存有 XMLHttpRequest 的状态信息。

下面是 XMLHttpRequest 对象的三个重要的属性:

属性 描述
onreadystatechange 每当readyState发生变化时,都会触发此函数
readyState

有0-4五种状态:

0:请求未初始化

1:服务器建连接

2:请求已接收

3:请求处理中

4:处理完毕,响应就绪

从0-4会触发四次onreadystatechange函数

status

200:响应成功

404:未找到页面

 省市联动案例:

两个页面:

showCity.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>

<script type="text/javascript">
//创建xmlHttpRequest对象
function getXmlHttpObject(){
	var xmlhttp;
	if (window.ActiveXObject)
	{
		
		// IE6, IE5 浏览器执行代码
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		//window.alert("其他");
	
	}
	else
	{	
		//  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
		xmlhttp=new XMLHttpRequest();
		
		
	}
	return xmlhttp;
}
var myXmlRequest="";
function getCity(){
	
	myXmlRequest=getXmlHttpObject();
	if(myXmlRequest){
		
		var url="showPro.jsp";
		var data="province="+$("province").value;
		myXmlRequest.open("post",url,true);
		myXmlRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		//myXmlRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

		 
		myXmlRequest.onreadystatechange=chuli;
		myXmlRequest.send(data);
	}
}

function chuli(){
	//window.alert("处理函数被调回"+myXmlRequest.readyState);
	 if(myXmlRequest.readyState==4&&myXmlRequest.status==200){
      //   window.alert(myXmlRequest.status);
         window.alert(myXmlRequest.responseXML);
         var cities=myXmlRequest.responseXML.getElementsByTagName("city");
         $("city").length=1;
         for (var i=0;i<cities.length;i++){
             var city=cities[i].childNodes[0].nodeValue;
             var myOption=document.createElement("option");
             myOption.innerText=city;
             $("city").appendChild(myOption);
         }
         }
}
function $(id){
	return document.getElementById(id);
}

</script>

<select id="province" οnchange="getCity()">
    <option>--省--</option>
    <option value="山西">山西省</option>
    <option value="湖北">湖北省</option>
    
</select>
<select id="city" >
    <option >--市--</option>
</select>
<select id="xian">
    <option >--县--</option>
</select>

showPro.jsp

<%@ page language="java" contentType="text/html; charset=gb2312"%>
<!DOCTYPE html>
<%
request.setCharacterEncoding("utf-8");
response.setContentType("text/xml; charset=gb2312");
//注意这个地方
String province = request.getParameter("province");
System.out.println(province);
//System.out.println(new String("山西".getBytes("ISO-8859-1"),"utf-8"));
//province = new String(province.getBytes("iso-8859-1"),"utf-8");
if(province.equals("山西")){
	//System.out.println(province);
	out.println("<province><city>太原</city><city>晋中</city><city>临汾</city></province>");
}else if(province.equals("湖北")){
	out.println("<province><city>武汉</city><city>咸宁</city><city>黄石</city></province>");
}
%>

如果你发现利用responseXML得到的是null,那是因为你设置的response默认返回html类型的文件,所以你需要设置为XML文件,例如上面代码第一行,我用的开发工具直接生成的语句,就没注意,所以返回null,你需要修改此行代码

便是此行代码:

response.setContentType("text/xml; charset=gb2312");

运行结果:

结束了,一个小问题耽误了我大概一个小时的时间,都零点了,她睡了吗?

新的一天开始了,加油吧?

发布了90 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_37716512/article/details/90722633