基本场景和步骤:不需要整个界面的跳转,界面的局部刷新。如下图更新红框内容。
同步请求和异步请求
同步就是一件事情不做完不能开始下一个,异步就是做一个事情的时候也可以做其它事情
同步请求有两个问题
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&¶ms!=""){
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>