JavaScript实例第二十天

本文通过两个实例介绍了Ajax的基础应用。实例一展示了如何实现一个简单的Ajax框架,利用正则表达式判断请求文件类型并进行异步加载。实例二探讨了Ajax跨域异步交互的问题,通过XMLHttpRequest对象进行GET请求,并处理响应数据展示在页面上。同时,文章提到了由于浏览器策略导致的本地文件跨域问题。
摘要由CSDN通过智能技术生成

2021.11.16

实例一、实现一个Ajax框架

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>实现一个Ajax框架</title>
</head>

<body>
</body>
	
	<script type="text/javascript">
		/*11~25行利用了正则表达式来获取异步加载文件的类型*/
	function myAjaxFramework(options){
		var resType;
		if(!options||options.url){
			return false;
		}
		if(/txt/.test(options.url)){
			resType="xml";
		}else if(/xml/.test(options.url)){
			resType="xml"
		}else if(/json/.test(options.url)){
			resType="json"
		}else{
			resType=""
		}
		
	/*初始化数据*/
		options.data=options.data||"";
		options.method=(options.method||"GET").toUpperCase();//get
		options.async=options.async||true;//异步还是同步,此处为异步
		options.responseType=options.responseType||reType;//设置返回值
		options.successCall=options.successCall||false;//成功回调
		options.failureCall=options.failureCall||false;//失败回调
		var xhr;
		if(window.XMLHttpRequest){
			xhr=new XMLHttpRequest();
		}else if(window.AcctiveXObject){
			xhr=new AcctiveXObject("Microsoft.XMLHTTP");
		}else{
			xhr=null;
		}
		if(xhr!=null){
			xhr.onreadystatechange=function(){
				if(xhr.readyState==4){
					if(xhr.status==200){
						if(options.successCall){
							options.successCall(getResponseData(xhr,options.responseType));
						}
					}else{
						if(options.failureCall){
							options.failureCall(xhr,xhr.status)
						}
					}
				}
			};
			xhr.open(options.method,options.url+(options.method=="GET"?"?"+options.data:""),options.async);
			if(options.method!="GET" && options.data){
				xhr.send(options.data)
			}else{
				xhr.send();
			}
		}else{
			console.log("Your browser does not support")
		}
		return true;//myAjaxFramework调用成功
		}
		function getResponseData(xhr,resType){
			if(resType==="text"){
				return{resType:resType,resData:xhr.responseText}
			}else if(resType==="xml"){
				return{resType:resType,resData:xhr.responseXML}
			}else if(resType==="json"){
				return{resType:resType,resData:JSON.parse(xhr.responseText)}
			}else{
				return{}
			}
			
		}
		
	</script>
</html>

此框架主要功能是区分文件类型并实现异步加载功能

实例二、Ajax跨域异步交互

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Ajax跨域异步交互</title>
</head>
	<div id="id-div-ajax" style="">
	<input type="button" onclick="ajax_load_php_request()" value="通过Ajax解析PHP">
		<div>解析文件:</div>
		<div id="id-div-ajax-php"></div>
	</div>

<body>
</body>
<script type="text/javascript">
	var xhr=null;
	function ajax_load_php_request(){
		if(window.XMLHttpRequest){
			xhr=new XMLHttpRequest();
		}else if(window.ActiveXObject){
			xhr=new ActiveXObject();
		}else{
			xhr=null;
		}
		if(xhr!=null){
			xhr.onreadystatechange=on_state_change;
			xhr.open("GET","ajax.php",true);
			xhr.send(null)
		}else{
			console.log("出错")
		}
		
	}
	function on_state_change(){
		var resText,iPos,vData,resHson,jsonObj,iLen;
		if(xhr.readyState==4){
			if(xhr.status==200){
				resText=xhr.responseText;
				iPos=resText.indexOf("!");
				vData=resText.substf(0,iPos+1);
				resJson=resText.substr(iPos+1);
				if(resJson.indexOf('{')>-1){
					jsonObj=JSON.parse(resJson);
					iLen=jsonObj.length;
					vData+="<table border='1'><tr><th>Title</th><th>Address</th><th>Info</th></tr>"
					for(let i=0;i<iLen;i++){
						vData+="<tr>";
						{
							try{
								vData+="<td>"+jsonObj[i].title+"</td>"
							}catch(err){
								vData+="<td><.td>"
							}
						}
						vData+="</td>"
					}
					vData+="</table>"
					document.getElementById("id-div-ajax-php").innerHTML=vData;
				}else{
					document.getElementById("id-div-ajax-php").innerText=resText;
				}
			}else{
				console.log("Problem")
			}
		}
	}
	</script>
</html>

php文件

<?php
echo "Hello,this is from server php file by ajax!";
$webArr=array{
array("title"=>"JavaScript","address"=>"http://www.jscode.com","info"=>"JavaScript Code Seqments"),array("title"=>"jQuery","address"=>"http://www.jqcode.com","info"=>"Ajax Code Seqments")
);
echo json_encode($webArr);
?>

因为现在浏览器的策略问题,本地文件的访问都打不开,所以在浏览器中运行还是会显示跨域问题

推荐一个博主写的博客,对ajax的描述很清楚,转载:
ajax详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值