Ajax——Asynchronous JavaScript and XML

1. XMLHttpRequest 对象:

1.1 概述:

XMLHttpRequest 对象是一个JavaScript 对象,能够通过 HTTP 协议连接到服务器。Ajax的异步性就是由这个对象的特性获得的。
XMLHttpRequest 向服务器发送一个异步请求,一旦请求被初始化,其余的js代码不需要等待服务器端相应,即异步。
当然,XMLHttpRequest 也可以发送同步请求。

流程图

1.2 方法:

open()、send()、abort()、setRequestHeader()

1.2.1 open(method, url,async,username,password):初始化HTTP 请求参数,但不发送:

open(method, url,async,username,password)

参数:

  • method: 请求的 HTTP 方法,包括:GET 、POST、HEAD。
  • url: 请求的 url 地址。
    XMLHttpRequest 受同源策略的约束,不能跨域访问资源。
    同源即协议、端口、主机名均相同。
  • async: 请求是否异步执行。
    如果这个参数是 false,请求是同步的,后续对 send() 的调用将阻塞,直到响应完全接收。
    如果这个参数是 true 或省略,请求是异步的,且通常需要一个 onreadystatechange 事件句柄,当请求状态改变时会触发这个事件。
  • username / password: 可选,为 url 所需的授权提供认证资格。如果指定了,它们会覆盖 url 自己指定的任何资格。

1.2.2 send(body):发送 HTTP 请求。

send() 方法用于发送 HTTP 请求。
如果是异步请求,则此方法会在请求发送后立即返回;如果是同步请求,则此方法直到响应到达后才会返回。
send() 方法接受一个可选的参数,其作为请求主体;如果请求方法是 GET 或者 HEAD,则应将请求主体设置为 null。

1.2.3 setRequestHeader(header,value) :设置 HTTP 请求头信息。

注意: 在这之前,你必须确认已经调用了 open() 方法打开了一个 url

header: 规定头的名称; value: 规定头的值

var xhr = new XMLHttpRequest();
xhr.open("POST","/save",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("name=lucy&age=18");

1.2.4 abort() : 取消Http 请求。

1.3 属性

1.3.1 ReadyState 属性值列表

ReadyState 值 描述
0 未初始化 Uninitialized —— 已创建 XMLHttpRequest 对象,但还未初始化
1 创建请求 Open ——调用了 open(),准备好发送一个请求到服务器,但还未发送。
2 发送请求 Send —— 调用了 send(),请求已发送到 Web 服务器。未接收到响应。
3 接收响应 Receiving —— 响应头已接收完,响应体开始接收但未完成。
4 加载 Loaded —— HTTP 响应已经完全接收。

1.3.2 onreadystatechange 方法

每次 ReadyState 的值改变时,都会触发 onreadystatechange 事件句柄。

1.3.3 responseType: XMLHttpRequestResponseType

设置该值能够改变响应类型,就是告诉服务器你期望的响应格式

1.3.4 responseText

服务器接收到的响应体(不包括头部),还没有接收到数据的话,就是空字符串。
如果 readyState 小于 3,这个属性就是一个空字符串。
当 readyState 为 3,这个属性返回目前已经接收的响应部分。
如果 readyState 为 4,这个属性保存了完整的响应体。

1.3.5 responseXML

此 responseXML 属性用于当接收到完整的HTTP响应时(readyState为4),将请求的响应描述为 XML, 并作为 Document 对象返回。

1.3.6 status 属性

此 status 为服务器返回的 HTTP 状态码。
仅当 readyState 为 3 或 4 时,这个属性才可用,readyState 小于 3 时读取会引发异常。

常用 HTTP 状态码:

状态码 类别
1XX 信息类状态码
2XX 成功类状态码
3XX 重定向状态码
4XX 客户端错误状态码
5XX 服务端错误状态码

egs:
200 —— 请求成功
301 —— 永久性重定向
302 —— 临时性重定向
401 —— 未经授权
403 —— 禁止访问
404 —— 请求的 url 不存在
500 —— 请求未完成,服务器错误。

1.3.7 statusText 属性

此 statusText 为服务器返回的 HTTP 状态码文本。如:200 —— OK,404 —— Not Found,500 —— Internal Server Error
仅当 readyState 为 3或4时,这个属性才可用,小于3时读取会引发异常。

  • 小结:以上为 XMLHttpRequest level1 的相关知识,下面用基于XMLHttpRequest level1 的相关知识创建一个 AJAX 请求来读取文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ajax 读取 txt </title>
</head>
<body>
<button id="getJson">get</button>
<br>
<br>
<div id="displayJson"></div>
<script>
    document.getElementById('getJson').addEventListener('click', clickGet);
    function clickGet(){
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'simple.txt', true);//创建请求
        xhr.send();//发送请求
        //onreadystatechange 监控ReadyState 变化。
        xhr.onreadystatechange = function(){
    if ( xhr.readyState == 4 && xhr.status == 200 ) {
          document.getElementById('displayJson').innerHTML = this.responseText;
        }
      };
    }
</script>

</body>
</html>

simple.txt 内容为:there is txt data
则运行 HTML 并点击 get 按钮后页面显示如下:

1.4 XMLHttpRequest Level 2

HTML5 之后的 XMLHttpRequest Level 2 针对 XMLHttpRequest Level 1 进行了改进如下:

  • 可以设置HTTP请求的超时时间。
  • 可以使用FormData对象管理表单数据。
  • 不仅可以发送文本信息,还可以上传文件。
  • 可以请求不同域名下的数据(跨域请求)。
  • 可以获取服务器端的二进制数据。
  • 可以获得数据传输的进度信息。

1.4.1设置超时:timeout & ontimeout

xhr.timeout = 5000;  //设置超时时间,过了超时时间,自动停止HTTP请求
xhr.ontimeout = function(e) {
  //指定超时的回掉函数
    alert('请求超时!');
}

1.4.2 使用 FormData 对象管理表单数据

HTML 5新增了一个 FormData 对象,用于管理表单数据。

    1. 新建一个 FormData 对象
var form = document.getElementById('myform'); // 获取页面上表单对象
var formData = new FormData(form)

参数 form(可选):
一个HTML 上的 <form> 表单元素,当指定了,这种方式创建的对象会自动将 form 中的表单值也包含进去,包括文件内容也会被编码之后包含进去,未指定则 formData 为一个空的 FormData 对象。

    1. 添加表单项
var formData = new FormData();
formData.append('username', 'jane');
formData.append('id', 20190823);
    1. 提交表单,直接传送这个 formData 对象
xhr.send(formData);

1.4.3 上传文件

    1. 首先使用 type 为 file 的 input 输入框来选中一个文件
<input id="upload" type="file">
    1. 将选中的文件添加为表单项
var input = document.getElementById("upload");
var formData = new FormData();
formData.append("file", input.files[0]); // file名称与后台接收的名称一致
    1. 发送表单数据
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/uploadFile');//创建请求
xhr.send(formData);//发送请求

1.4.4 跨域资源共享 (CORS)

跨域资源共享(Cross-origin resource sharing,简称 CORS)。
使用"跨域资源共享"的前提,是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。

var xhr = new XMLHttpRequest();
xhr.open('GET', url);  //创建请求
xhr.send();  //发送请求

1.4.5 处理二进制数据

  • Level 1 的 XMLHttpRequest 对象只能处理文本数据,新版则可以处理其他类型数据。
  • 通过设置 ResponseType 来改变响应类型,告诉服务器你期望的响应格式。
    把 responseType 设为 blob,表示服务器传回的是二进制对象。
  • 接收数据的时候,用浏览器自带的 Blob 对象即可。
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/image.png');
xhr.responseType = 'blob';
xhr.send();
xhr.onreadystatechange = function(){
 if ( xhr.readyState == 4 && xhr.status == 200 ) {
     var blob = new Blob([xhr.response], {type: 'image/png'});
    }
};

1.4.6 进度信息

传输数据时,由progress事件返回进度信息,分为上传和下载。

  • 下载的progress事件属于XMLHttpRequest对象
  • 上传的progress事件属于XMLHttpRequest.upload对象。
//total是需要传输的总字节,loaded是已经传输的字节,如果lengthComputable值不为 true,则 total 为0
function updateProgress(event) {
    if (event.lengthComputable) {
        var progress = event.loaded / event.total;
    }
}
xhr.onprogress = updateProgress;// 下载的progress事件
xhr.upload.onprogress = updateProgress;// 上传的progress事件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,857评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • AJAX 原生js操作ajax 1.创建XMLHttpRequest对象 var xhr = new XMLHtt...
    碧玉含香阅读 3,169评论 0 7
  • 本文详细介绍了 XMLHttpRequest 相关知识,涉及内容: AJAX、XMLHTTP、XMLHttpReq...
    semlinker阅读 13,602评论 2 18
  • 要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤: (1)创建XMLHttpRequest对象,也就...
    亲爱的翔子阅读 489评论 0 0