48--Ajax技术--原生

AJAX技术

传统网站中存在的问题

  • 网速慢的情况下,页面加载时间长,只能等待
  • 表单提交后,如果一项内容不合格,需要重新填写所有表单内容
  • 页面跳转,重新加载页面,造成资源浪费,增加用户等待时间

Ajax概述

Ajax:标准读音[ˈeɪ.dʒæks],中文音译:阿贾克斯

AjAX=Asynchronous javaScript and XML(异步的javaScript和XML)。

它是浏览器提供的一方法,可以实现页面无刷新更新数据,提高用户浏览网站应用的体验。

Ajax的应用场景

1.页面上拉加载更多数据

2.列表数据无刷新分页

3.表单项离开焦点数据验证

4.搜索框提示文字下拉洌表

5.商品系统。

6.评价系统。

7.地图系统。

......

Ajax优缺点

AJAX可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的响应。这样在服务器和浏览器之间交换的数据大量减少,服务器响应的速度就更快了。但Ajax技术也有劣势,最大劣势是不能直接进行跨域访问。

Ajax运行原理

Ajax相当于浏览器发送请求与接收响应的代理人,实现在不影响用户浏顺面的情况下,局部更新页面数
据,从而提高用户体验。

1594036466440

传统Web应用中简易的同步模型分析

1594087565196

基于Ajax技术的异步请求响应模型分析

1594087625457

Ajax 请求响应过程分析

​ 所有的Ajax 请求都会基于DOM(HTML元素)事件,通过XHR(XMLHttpRequest)对象实现与服务端异步通讯局部更新.按照以下图例分析:

1594087878889

Ajax的实现步骤

1.创健Ajax对象

创建异步请求对象

var xhr = new XMLHttpRequest() ;

2 注册事件监听

注册XHR对象状态监听,通过回调函数(callback)处理状态信息

xhr.onreadystatechange=function(){
    if(xhr.readyState==4&&xhr.status==200){
        console.log(xhr.responseText);//此处只是打印
    }
}

readyState状态说明

  • 0:未初始化,尚未调用open() 方法
  • 1:启动。已经调用open() 方法,但尚未调用send() 方法
  • 2:发送。已经调用send() 方法,但尚未接收到响应
  • 3:接收。已经接收到部分响应
  • 4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了

3.告诉Ajax请求地址以及请求方式

建立与服务端的连接

xhr.open('get', 'https://www.baidu.com') ;

4.发送请求

对于一个请求而言,往往不同的是什么?
//1)url可能不同
//2)参数可能不同
//3)处理结果的方式不同
发送请求的方式为get方式时,send方法内部传null

xhr.send(null) ;

Ajax 请求响应编程操作实践

Ajax Get 请求操作实现(基于js)

基于ajax技术中的XMLHttpRequest对象,向服务端发起异步Get请求,关键代码分析(模板)

<script type="text/javascript">
function doAjaxGet(url,params,callback){
    //1.创建XmlHttpRequest对象
    var xhr = new XMLHttpRequest();
    //2.设置状态监听,监听XmlHttpRequest对象与服务端通讯的过程(例如连接是否建立,请求是否在处理,响应是否已产生)
    xhr.onreadystatechange=function(){
        if(xhr.readyState==4&&xhr.status==200){
            //500表示服务端出错了
        	   //服务端响应的结果会传递给XHR对象,我们可以借助responseText获取响应结果
            callback(xhr.responseText);
        }
    }
	//3.创建与服务端的连接
    xhr.open("GET",url+"?"+params,true)
    //发送请求
    xhr.send(null);
    //5.对响应结果进行处理(在回调函数中处理)。
}
</script>

处理实际请求的js代码

<div>
    <input type="text" name="key" id="key">
    <button onclick="doAjaxGetRequest()">doAjaxGetRequest</button>
</div>
function doAjaxGetRequest(){
    var value= document.getElementById("key").value;
    var url ="/ajax/a1";
    var params ="key="+value;
    doAjaxGet(url,params,function(result){
        document.getElementById("result").innerHTML=result;
    })

}

服务端代码:

@Controller
@RequestMapping("/ajax")
public class AjaxController {
    static Map<String, String> map = new HashMap<>();
    static {
        map.put("A", "100");
        map.put("B", "200");
    }
    @RequestMapping("/a1")
    @ResponseBody//将响应的内容以串的形式进行返回.
    public String doAjaxGetRequest(String key) {

        return map.get(key);
    }
}

Ajax Post 请求操作实现(基于js)

基于ajax中XMLHttpRequest对象,向服务端发起异步Post请求。对于post请求在发送请求执行需要设置请求头.

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

function doAjaxPost(url,params,callback){
    //1.创建XmlHttpRequest对象
    var xhr=new XMLHttpRequest();
    //2.设置状态监听,监听XmlHttpRequest对象与服务端通讯的过程.
    xhr.onreadystatechange=function(){//callback(回调函数)
        //基于xhr对象获取的通讯状态,对响应数据进行处理
        if(xhr.readyState==4&&xhr.status==200){//500表示服务端出错了
            //服务端响应的结果会传递给XHR对象,
            //我们可以借助xhr.responseText获取响应结果
            callback(xhr.responseText);
        }
    }
    //3.创建与服务端的连接
    xhr.open("POST",url,true);//true表示异步
    xhr.setRequestHeader("Content-Type",
                         "application/x-www-form-urlencoded");
    //4.发送请求
    xhr.send(params); //post请求将参数写到send方法
    //5.对响应结果进行处理(在回调函数中处理)。
}

处理实际请求的js代码:

<div>
    <button onclick="doAjaxPostRequest()">doAjaxPostRequest</button>
</div>
function doAjaxPostRequest(){
    var url ="/ajax/a2";
    var params ="key=B&value=200";
    doAjaxPost(url,params,function(result){
        document.getElementById("result").innerHTML=result;
    })

}

服务端代码:

@Controller
@RequestMapping("/ajax")
public class AjaxController {
	
	static Map<String, String> map = new HashMap<>();
	static {
		map.put("A", "100");
		map.put("B", "200");
	}	
	@RequestMapping("/a2")
	@ResponseBody//将响应的内容以串的形式进行返回.
	public String doAjaxPostRequest(String key,String value) {
		
		return "save data ["+key+","+value+"]";
	}		
}

Ajax 编程框架基本实现

我们在实际的js编程中经常会以面向对象的方式进行实现

入门案例:执行函数的一种方式(function(){})(),表示立刻执行当前匿名函数,在函数内部可以定义其他函数

(function(){
    var point =function(x,y){this.x = x,this.y = y};//表示定义函数(一个类型)
    //每个函数内部都有一个prototype属性,指向一个原型链对象,基于这个属性,
    //可以像指定的函数内部添加方法,属性
    point.prototype={.
        setX:function(x){this.x=x},
        setY:function(y){this.y = y},
        getX:function(){return this.x},
        getY:function(){return this.y}
    }
	window.pointObj = new point(10,20);//构建函数对象,并且将对象赋值给一个全局变量
	//window对象是一个全局对象
})();//表示立刻执行当前匿名函数

测试:以面向对象的方式访问,调用

pointObj.getX()//调用对象函数.
10
pointObj.setY(200)
undefined
pointObj.getY()
200

原生Ajax种js实现:

(function(){
	//定义一个函数,可以将其认为java中的类
	var ajax=function(){}
	//在变量ajax指向的类中添加成员,例如doAjaxGet函数,doAjaxPost函数
    //通过prototype属性向当前ajax函数再添加函数
	ajax.prototype={
	   doAjaxGet:function(url,params,callback){
		      //创建XMLHttpRequest对象,基于此对象发送请求
		      var xhr=new XMLHttpRequest();
		      //设置状态监听(监听客户端与服务端通讯的状态)
		      xhr.onreadystatechange=function(){//回调函数,事件处理函数
		          if(xhr.readyState==4&&xhr.status==200){
		             //console.log(xhr.responseText);
		             callback(xhr.responseText);//jsonStr
		          }
		      };
		      //建立连接(请求方式为Get,请求url,异步还是同步-true表示异步)
		      xhr.open("GET",url+"?"+params,true);
		      //发送请求
		      xhr.send(null);//GET请求send方法不写内容
		    },
		//函数与函数之间必须有逗号隔开
	      doAjaxPost:function(url,params,callback){
		      //创建XMLHttpRequest对象,基于此对象发送请求
		      var xhr=new XMLHttpRequest();
		      //设置状态监听(监听客户端与服务端通讯的状态)
		      xhr.onreadystatechange=function(){//回调函数,事件处理函数
		          if(xhr.readyState==4&&xhr.status==200){
		             //console.log(xhr.responseText);
		             callback(xhr.responseText);//jsonStr
		          }
		      };
		      //建立连接(请求方式为POST,请求url,异步还是同步-true表示异步)
		      xhr.open("POST",url,true);
		      //post请求传参时必须设置此请求头
		        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

		      //发送请求
		      xhr.send(params);//post请求send方法中传递参数
	   }
	}
	window.Ajax=new ajax();//构建Ajax对象,并且将其对象赋值给全局变量
})()//立刻执行匿名函数

* JS调试技巧

  • 断点调试:通过在js代码中写入debugger关键字,运行程序,一步一步调试,或者在运行过程中打断点调试

  • 通过console.log(....) alert(...)来输出信息,追踪数据

  • 排除法:根据之前的代码进行排除.

posted on 2020-07-07 18:05  liqiangbk  阅读(307)  评论(0编辑  收藏  举报

导航