【浅入AJAX一】AJAX概要&AJAX XHR

本文介绍了AJAX的基础概念和核心组件XMLHttpRequest(XHR),详细阐述了AJAX的使用过程,包括open()和send()方法的用法,以及readyState状态的变化。通过理解这些内容,开发者能够更好地掌握异步数据交互的原理。
摘要由CSDN通过智能技术生成

AJAX概要&AJAX XHR

1.概述

AJAX(Asynchronous JavaScript and XML)–异步JavaScript和XML,早出现在 2005 年的 Google Suggest,是在浏览器端进行网络编 程(发送请求、接收响应)的技术方案,它使我们可以通过 JavaScript 直接获取服务端新的内容而不必重新加载 页面,是无刷新数据读取的技术,一种创建交互式网页应用的网页开发技术。让 Web 更能接近桌面应用的用户体验。
说白了,AJAX 就是浏览器提供的一套 API,可以通过 JavaScript 调用,从而实现通过代码控制请求与响应。实现 网络编程。

2.AJAX XHR

2.1 使用 AJAX 的过程可以类比平常我们访问网页过程

代码如下:

// 1. 创建一个 XMLHttpRequest 类型的对象 —— 相当于打开了一个浏览器 
var xhr = new XMLHttpRequest();  
//2、打开与一个网址之间的连接 —— 相当于在地址栏输入访问地址
xhr.open('get',url,true);
//3、 通过连接发送一次请求 —— 相当于回车或者点击访问发送请求 
xhr.send();
//4、 指定 xhr 状态变化事件处理函数 —— 相当于处理网页呈现后的操作 
xhr.onreadystatechange = function(){
 // 通过 xhr 的 readyState 判断此次请求的响应是否接收完成 
 if(xhr.readyState == 4){
    // 通过 xhr 的 responseText 获取到响应的响应体 
   if(xhr.status == 200){
     console.log('成功: '+xhr.responseText);
   }else{
     console.log('失败');
   }
 }
}
2.2 XMLHttpRequest对象的的 open() 和 send() 方法详解:

在这里插入图片描述

2.2.1 open(method,url,async)

参数一:提交方法——GET/POST:

GET:用于获取数据(如:浏览贴子,分享商品地址等),把数据放在url(网址)里来提交,安全性低、容量小,适合获取,且会缓存

POST:用于上传数据(如:用户注册,上传图片等),把数据放在报体里提交,安全性一般、容量几乎无限

参数二:文件路径——服务器上的文件地址,

该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务)。如果需要阻止缓存:

  'abc.txt?&'+new Date().getTime(); //每次提交时间戳不同 

参数三:同步和异步——false/true(事件一件一件进行就是同步,多件事一起进行就是异步):同步会阻塞后续代码,异步不会

XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:

对于 web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。

通过 AJAX,JavaScript 无需等待服务器的响应,而是:

在等待服务器响应时执行其他脚本
当响应就绪后对响应进行处理

2.2.2 sent()

一般就调用sent()方法就可以

xhr.send();

如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

xhr.open("POST","ajax_test.asp",true);
//向请求添加HTTP头 两个参数(header: 规定头的名称,value: 规定头的值)
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("fname=Bill&lname=Gates");
2.2.3 readyState

由于 readystatechange 事件是在 xhr 对象状态变化时触发(不单是在得到响应时),也就意味着这个事件会被 触发多次,所以我们有必要了解每一个状态值代表的含义:

在这里插入图片描述

通过下面这个例子来理解这五个状态:

  var xhr = new XMLHttpRequest() console.log(xhr.readyState)// => 0 
    // 初始化 请求代理对象   
    xhr.open('GET', 'time.php') console.log(xhr.readyState)// => 1 
    // open 方法已经调用,建立一个与服务端特定端口的连接   
    xhr.send();   
    xhr.addEventListener('readystatechange', function () {   
      switch (this.readyState) {     
        case 2:       
          // => 2       
          // 已经接受到了响应报文的响应头         
          // 可以拿到头       
          // console.log(this.getAllResponseHeaders())       
          console.log(this.getResponseHeader('server'))// 但是还没有拿到体       
          console.log(this.responseText)breakcase 3:       
          // => 3       
          // 正在下载响应报文的响应体,有可能响应体为空,也有可能不完整         
          // 在这里处理响应体不保险(不可靠)       
          console.log(this.responseText)breakcase 4:       
          // => 4       
          // 一切 OK (整个响应报文已经完整下载下来了)         
          // 这里处理响应体       
          console.log(this.responseText)break} 
    })

理解这个过程后得出:一般我们都是在 readyState 值为 4 时,执行响应的后续逻辑。

2.2.4 请求遵循HTTP

本质上 XMLHttpRequest 就是 JavaScript 在 Web 平台中发送 HTTP 请求的手段,所以我们发送出去的请求仍然是 HTTP 请求,同样符合 HTTP 约定的格式:

 // 设置请求报文的请求行 
    xhr.open('GET', './time.php'); 
    // 设置请求头 
    xhr.setRequestHeader('Accept', 'text/plain');
    // 设置请求体 
    xhr.send(null)   
    
    xhr.onreadystatechange = function () {   
      if (this.readyState == 4 && xhr.status==200) {     
      	// 获取响应状态码     
        console.log(this.status);     
        // 获取响应状态描述     
        console.log(this.statusText);     
        // 获取响应头信息     
        console.log(this.getResponseHeader('Content‐Type')); // 指定响应头     
        console.log(this.getAllResponseHeaders()); // 全部响应头     
        // 获取响应体     
        console.log(this.responseText); // 获得字符串形式的响应数据 
        console.log(this.responseXML); // 获得 XML 形式的响应数据   
      } 
    };

responseText属性:返回的数据(无论什么数据都是字符串);

status属性:是否成功(200成功,常见失败404):

1字头:消息类
2字头:成功类型
3字头:重定向,请求发生了页面跳转(包括缓存
4字头:客户端错误(请求错误)
5字头:服务器错误

具体的状态码可自行查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值