先创建一个XMLHttpRequest 对象:
- function createAjaxObject(){
- var xmlHttpRequest;
- try{
- xmlHttpRequest = new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
- }catch(e){
- try{
- xmlHttpRequest = new ActiveXObject("Msxm12.XMLHTTP");// Internet Explorer6.0+
- }catch(e){
- try{
- xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");//Internet Explorer 5.5+
- }catch(e){
- alert("你这是什么破浏览器啊!");
- return false;
- }
- }
- }
- return xmlHttpRequest;
- }
异步方法使用:
- function getJSON2(){
- var tmp;
- var xmlHttpRequest=createAjaxObject();
- xmlHttpRequest.open('GET',url,true);//GET即采用get方法,url为请求的地址,true设置为异步,默认就是异步,所以也可以不用写
- xmlHttpRequest.send(null);
- xmlHttpRequest.onreadystatechange = function(){ //注册回调函数
- //readyState有四种可能值:0——请求未初始化(在调用 open() 之前),1——请求已提出(调用 send() 之前),2——请求已发送(这里通常可以从响应得到内容头部),3——请求处理中,4——请求已完成。
- if(xmlHttpRequest.readyState==4){
- if(xmlHttpRequest.status == 200){
- alert(xmlHttpRequest.responseText);
- //var json = eval('('+xmlHttpRequest.responseText+')');
- //alert(json.Stops[0].StopName);
- //tmp = json.Stops[0].StopName;
- //alert(tmp);//有值
- }
- }
- }
- //alert(tmp); //没有值
- xmlHttpRequest=null;
- }
同步方法:
- function getJSON2(){
- var tmp;
- var xmlHttpRequest=createAjaxObject();
- xmlHttpRequest.open('GET',url,false);//GET即采用get方法,url为请求的地址,false设置为同步,默认就是异步,所以也可以不用写
- xmlHttpRequest.send(null);
- var result = xmlHttpRequest2.status;
- if(result == 200){
- alert(xmlHttpRequest.responseText);
- //var json = eval('('+xmlHttpRequest.responseText+')');
- //alert(json.Stops[0].StopName);
- //tmp = json.Stops[0].StopName;
- //alert(tmp);//有值
- }
- //alert(tmp); //有值,成功,但是破坏了ajax异步的初衷。
- xmlHttpRequest=null;
- }
分析原因:
如果是异步(true),返回值是null,因为程序执行完send后不等xmlhttp的响应,而继续执行下一条js语句,所以tmp还没有来的及变化就已经返回null了。所以如果想获得xmlhttp返回值必须用同步,异步无法得到返回值。 这就是为什么我在后面的操作一直取不到这个函数的返回值的缘故了。ajax的同步破坏了ajax异步的初衷,除非忘不得已(比如需要对响应的数据进行进一步处理)才使用。
还有,同步异步使用xmlhttp池时都要注意:取得xmlhttp时只能新建xmlhttp,不能从池中取出已用过的xmlhttp,(这种情况主要发生在需要循环的时候)因为被使用过的xmlhttp的readyState为4,所以同步异步都会send但不执行onreadystatechange。