ajax

基本场景和步骤:不需要整个界面的跳转,界面的局部刷新。如下图更新红框内容。

 同步请求和异步请求

同步就是一件事情不做完不能开始下一个,异步就是做一个事情的时候也可以做其它事情

同步请求有两个问题

1.界面会卡顿,卡顿多长时间,取决于网络速度

2.xhr.onreadystatechange的回调将不会被执行,需要修改代码后才能获取到数据。将回调去除即可

我们用异步来设计网页。

单线程,多线程

10个屋子,一个人打扫需要100分钟,十个人打扫需要10分钟,这就是多线程。

js代码是单线程的

封装Ajax

对象都是key和value的形式存在的。

//解决
//1.参数的顺序不可改变
//2.参数没有默认值,每次都得传递
//解决方法,传递对象,而不是一个个的值
obj={
	url:"xxx",
	type:"get",
	dataType:"json"
	data:{
		uname:"zhangsan",
		age:"18"
	},
	success:function(){}
}; 

function myAjax2(obj){
	var defaults={
		type:"get",
		url:"#",
		dataType:"json",
		data:{},
		async:true,
		success:function(result){console.log(result);}
	};

	//obj中的属性,覆盖到defaults中的属性
	//1.如果有一些属性只存在obj中,会给defaults中增加属性
	//2.如果有一些属性在obj和defaults中都存在,会将defaults中的默认值覆盖
	//3.如果有一些属性只在defaults中存在,在obj中不存在,这时候defaults中将保留预定义的。
	for(var key in obj){
		defaults[key]=obj[key];
	}
	//1.ajax第一步
	var xhr=null;
		//判断,是为了舍弃IE6的情况
	if(window.XMLHttpRequest){
		xhr=new XMLHttpRequest();
	}else{
		xhr=new ActiveXObject("Microsoft.XMLHTTP");
	}
//2.ajax第二步
var params="";
for(var attr in defaults.data){
	params+=attr+"="+defaults.data[attr]+"&";
}
if(params){
	params=params.substring(0,params.length-1);
}
if(defaults.type=="get"){
	defaults.url+="?"+params;
}
xhr.open(defaults.type,defaults.url,defaults.async);
if(defaults.type=="get"){
	xhr.send(null);
}else if(defaults.type=="post"){
	xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	xhr.send(params);
}

//3.
if(defaults.async){
	xhr.onreadystatechange=function(){
		if(xhr.readyState==4){
			if(xhr.status==200){
				var result=null;
				if(defaults.dataType=="json"){
					result=xhr.responseText;
					result=JSON.parse(result);
				}else if(defaults.dataType=="xml"){
					result=xhr.responseXML;
				}else{
					result=xhr.responseText;
				}
				defaults.success(result);
			}
		}
	};
}else{
	if(xhr.readyState==4){
		if(xhr.status==200){
			var result=null;
if(defaults.dataType=="json"){
result=xhr.responseText;
result=JSON.parse(result);
}else if(defaults.dataType=="xml"){
	result=xhr.responseXML;
}else{
	result=xhr.responseText;
}
defaults.success(result);
}
}
}
}

调用封装好的ajax:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>注册界面</title>
	 //调用封装的ajax方法 
	<script type="text/javascript" src="myutils.js"></script>
	<script type="text/javascript">
 
			//1.创建对象
			var xhr=null;
			//兼容性判断
			if(window.XMLHttpRequest){
				xhr=new XMLHttpRequest();
			}else{
				//考虑IE6
				xhr=new ActiveXObject("Microsoft.XMLHTTP");
			}	
			if(type=="get"){
				if(params&&params!=""){
					url+="?"+params; 
				}
			}	
			//2.准备发送
			xhr.open(type,url,async);//true是异步,false是同步
			//3.执行发送get 是null;post是xhr.setRequestHeader();xhr.send(params);
			if(type=="get"){
				xhr.send(null);
			}else if(type=="post"){ 
			xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xhr.send(params);
			} 

			//异步的情况下
			if(async){
			//4.执行回调
			xhr.onreadystatechange=function(){
				//获取想要的数据
				if(xhr.readyState==4){
					if(xhr.status==200){
						var result=null;
						if(dataType=="json"){
							result=xhr.responseText;
							//将JSON变成对象
							result=JSON.parse(result);
						}else if(dataType=="xml"){
							result=xhr.responseXML;
						}else{
							result=xhr.responseText;
						}
						//将结果传递给调用者   
						if(callback){		//当callback存在的情况下				
							callback(result);
						}
					} 
				}
			};
		}else{
			//同步可以直接获取想要的数据
			if(xhr.readyState==4){
				if(xhr.status==200){
					var result=null;
					if(dataType=="json"){
						result=xhr.responseText;
						//将JSON变成对象
						result=JSON.parse(result);
					}else if(dataType=="xml"){
						result=xhr.responseXML;
					}else{
						result=xhr.responseText;
					}
					//将结果传递给调用者   
					if(callback){		//当callback存在的情况下				
						callback(result);
					}
				} 
			}
		}
		};
		window.onload=function(){
			var username=document.querySelector("#username");
			var email=document.querySelector("#email");
			var phone=document.querySelector("#phone");

			username.onblur=function(){
				var usernameValue=username.value;
				var type="get";
				var url="./server/checkUsername.php";
				var params="uname="+usernameValue;
				var dataType="text";
				
				myAjax2({
					url:url,
					data:{uname:usernameValue},
					dataType:"text",
					success:function(result){
						var username_result=document.querySelector("#username_result");
						if(result=="ok"){
							username_result.innerText="用户名可以使用";
						}else{
							username_result.innerText="用户名已经被注册";
						}
					}
				}); 
		};  
			email.onblur=function(){
				var emailValue=email.value;

				var type="post";
				var url="./server/checkEmail.php";
				var params="e="+emailValue;
				var dataType="text";
				
				myAjax2({
					url:url,
					type:"post",
					dataType:'text',
					data:{
						e:emailValue
					},
					success:function(result){
						var email_result=document.querySelector("#email_result");
						if(result==0){
							email_result.innerText= "邮箱可以使用";
						}else{
							email_result.innerText="邮箱不可使用";
						}
					}
				});
			};	 
			phone.onblur=function(){

				var phoneValue=phone.value;

				var type="post";
				var url="./server/checkPhone.php";
				var params="phonenumber="+phoneValue;
				var dataType="json";
				
				myAjax2({
					url:url,
					type:"post",
					data:{
					phonenumber:phoneValue
					},
					success:function(result){
						var phone_result=document.querySelector("#phone_result");
						if(result.status==0){
							//代表手机号码可用
							phone_result.innerText=result.message.tips+","+result.message.phonefrom;
						}else if(result.status==1){
							//代表手机号码不可用
							phone_result.innerText=result.message;
							}
				}
				});
		};
	};
	</script>
</head>
<body>
	<h1>注册界面</h1>
	<form action="">
		用户名:<input type="text" name="username" id="username">
		<span id="username_result"></span>
		<br> 
		邮箱:<input type="text" id="email"><span id="email_result"></span><br>
		手机号码:<input type="text" id="phone"><span id="phone_result"></span><br>
	</form>
</body>
</html>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值