请求种类

通过XMLHttpRequest的请求可以通过同步和异步的方式获取数据,请求的种类在XMLHttpRequest的open()方法的第三三个可选参数async设置。如果这个参数是true或者没有特别指定,那么XMLHttpRequest讲师异步,否则将是同步传输。总而言之,你要尽可能的少使用同步传输。

Note: 在Geoko30.0(Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27)以后,考虑到用户体验的不好影响,主线程上的异步传输被弃用

处理response

responseXML 属性

如果你使用XMLHttpRequest来获取远程的XML文档的内容,那么responseXML属性将返回一个DOM对象,此对象包含了一个被解析的XML文档,这个文档难解析和计算。下面5大主要的方法来处理这个XML文档:

  1. 使用 XPath 来强调(指向)部分内容。
  2. 使用 JXON 将其转化成Javascript对象树
  3. 手动的解析或者序列化XML成为字符串亦或对象。
  4. 使用 XMLSerializer 来序列化DOM树变成strings亦或files
  5. RegExp 可以被使用如果你提前知道了XML文档的内容。 如果你想去掉换行符,你可以使用正则来扫描换行符,但是这是不得已才能使用的方法,因为XML文档中的细微改变将会导致该方法的失败。

responseText 属性包括了 HTML 文档

如果你使用XMLHttpRequest来获取远程HTML文件的内容,那么responseText属性是一个包含了一系列HTML标签的字符,难解析和计算。

下面三个方法可以用来处理:

  1. 使用XMLHttpRequest.responseXML属性
  2. 使用fragment.body.innerHTML将内容注入到一个document fragment的主体中
  3. RegExp 可以被使用如果你提前知道了HTML的responseText的内容。 如果你想去掉换行符,你可以使用正则来扫描换行符,但是这是不得已才能使用的方法,因为XML文档中的细微改变将会导致该方法的失败。

处理二进制数据

虽然XMLHttpRequest被常用来发送和接受文本化的数据,但是它同样可以发送和接受二进制数据。

var oReq = new XMLHttpRequest();
oReq.open("GET", url);
// retrieve data unprocessed as a binary string
oReq.overrideMimeType("text/plain; charset=x-user-defined");
/* ... */

XMLHttpRequest Level 2 增加了新的responseType 属性将使得二进制数据处理更加简便

var oReq = new XMLHttpRequest();oReq.onload = function(e) {var arraybuffer = oReq.response; // not responseText/* ... */
}
oReq.open("GET", url);
oReq.responseType = "arraybuffer";
oReq.send();

监视进程

XMLHttpRequest 提供了监听一系列在请求正在进行中时发生的事件。这些事件包括了定期进度提醒,错误提醒等。

var oReq = new XMLHttpRequest();oReq.addEventListener("progress", updateProgress);
oReq.addEventListener("load", transferComplete);
oReq.addEventListener("error", transferFailed);
oReq.addEventListener("abort", transferCanceled);oReq.open();// ...// progress on transfers from the server to the client (downloads)
function updateProgress (oEvent) {if (oEvent.lengthComputable) {var percentComplete = oEvent.loaded / oEvent.total;// ...} else {// Unable to compute progress information since the total size is unknown
  }
}function transferComplete(evt) {console.log("The transfer is complete.");
}function transferFailed(evt) {console.log("An error occurred while transferring the file.");
}function transferCanceled(evt) {console.log("The transfer has been canceled by the user.");
}

第3到6行监听,在使用XMLHttpRequest进行数据转换时发送的事件。

Note: 你需要在调用call()事件之前添加监听。否则,监听事件将不会执行。

进程事件存在于下载和上传传输事件中。下载事件在XMLHttpRequest对象本身上被触发,就像上例一样。上传事件在XMLHttpRequest.upload对象中被触发,如下:

var oReq = new XMLHttpRequest();oReq.upload.addEventListener("progress", updateProgress);
oReq.upload.addEventListener("load", transferComplete);
oReq.upload.addEventListener("error", transferFailed);
oReq.upload.addEventListener("abort", transferCanceled);oReq.open();

Note: 进程事件在协议file: 中不可以使用。

Note: 从 Gecko 9.0 开始,进度事件现在可以依托于每一个传入的数据块,包括进度事件被触发前在已经接受了最后一个数据包且连接已经被关闭的情况下接收到的最后一个块。这种情况下,当该数据包的 load 事件发生时 progress 事件会被自动触发。这使你可以只关注 progress 事件就可以可靠的监测进度。

Note:在 Gecko 12.0 中,当 responseType 为 "moz-blob" 时,如果你的 progress 事件被触发,则响应的值是一个包含了接收到的数据的 Blob 。

使用 loadend 事件可以侦测到所有的三种加载结束条件(abort、load、error):

req.addEventListener("loadend", loadEnd);function loadEnd(e) {alert("The transfer finished (although we don't know if it succeeded or not).");
}

需要注意的是,没有方法可以确切的知道 loadend 事件接收到的信息是来自何种条件引起的操作终止;但是你可以在所有传输结束的时候使用这个事件处理。

提交表单和上传文件

XMLHttpRequest 的实例有两种方式提交表单:

  • 使用 AJAX
  • 使用 FormData API

第二种方式( 使用 FormData API )是最简单最快捷的,但是缺点是被收集的数据不是字符串形式的。
第一种方式反而是最复杂的但也是最灵活和最强大。

只使用 XMLHttpRequest

在大多数用例中,提交表单时即便不使用 FormData API 也不会要求其他的 API。唯一的例外情况是,如果你要上传一个或多个文件,你需要额外的FileReader API。

提交方法简介

一个 html <form> 可以用以下四种方式发送:

  • 使用 POST 方法,并设置 enctype 属性为 application/x-www-form-urlencoded (默认)
  • 使用 POST 方法,并设置 enctype 属性为 text/plain
  • 使用 POST 方法,并设置 enctype 属性为 multipart/form-data
  • 使用 GET 方法(这种情况下 enctype 属性会被忽略)

现在,我们提交一个表单,它里面有两个字段,分别被命名为 foo 和 baz。如果你用 POST 方法,那么服务器将会接收到一个字符串类似于下面三种情况之一,其中的区别依赖于你采用何种编码类型:

  • Method: POST; Encoding type: application/x-www-form-urlencoded (default):
Content-Type: application/x-www-form-urlencoded

foo=bar&baz=The+first+line.%0D%0AThe+second+line.%0D%0A

  • Method: POST; Encoding type: text/plain:
Content-Type: text/plain

foo=bar
baz=The first line.
The second line.

  • Method: POST; Encoding type: multipart/form-data:
Content-Type: multipart/form-data; boundary=---------------------------314911788813839-----------------------------314911788813839
Content-Disposition: form-data; name="foo"bar
-----------------------------314911788813839
Content-Disposition: form-data; name="baz"The first line.
The second line.-----------------------------314911788813839--

相反的,如果你用 GET 方法,一个像下面这样的字符串将被简单的附加到 URL:

?foo=bar&baz=The%20first%20line.%0AThe%20second%20line.

转载于:https://www.cnblogs.com/RachelChen/p/5430558.html

使用XMLHttpRequest相关推荐

  1. Access to XMLHttpRequest at file from origin ‘null‘ has been blocked by CORS policy谷歌浏览器本地打开项目js文件报错

    Access to XMLHttpRequest at 'file:///xxxxx/PQ.BaseInfo.proto' from origin 'null' has been blocked by ...

  2. 异步请求之XMLHttpRequest篇

    XMLHttpRequest 简介 XMLHttpRequest对象可以实现页面无刷新来实现与服务端进行数据交互.最先有微软公司设计,随后被Google,Mozilla等使用.现在已成为异步请求的标准 ...

  3. Ajax异步XMLHttpRequest对象

    示例Ajax: <%@ page language="java" contentType="text/html; charset=utf-8"pageEn ...

  4. 原生ajax XMLHTTPRequest()

    原生ajax XMLHTTPRequest() 视频 https://www.bilibili.com/video/BV1WC4y1b78y?p=10 代码 <!DOCTYPE html> ...

  5. 【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from origin ‘null‘ has been blocked by

    错误背景描述: 在使用ajax调用api接口的时候:发生错误如下 Access to XMLHttpRequest at 'http://xxxx.com/xxx' from origin 'null ...

  6. 转载 Xmlhttprequest对象池

    2019独角兽企业重金招聘Python工程师标准>>> 在ajax应用中,通常一个页面要同时发送多个请 求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就 ...

  7. AJAX初探,XMLHttpRequest介绍

    AJAX初探,XMLHttpRequest介绍 AJAX      AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML.      AJ ...

  8. xmlHttpRequest避免缓存的办法

    这几天被xmlHttpRequest缓存折腾的挺郁闷,第一次用Ajax做一个定时刷新的东西,结果每次返回值都和第一次一样,考虑到应该是缓存搞的鬼,然后经人指点,在url后面加一个随机数就可以解决了,因 ...

  9. [转]建一个XMLHttpRequest对象池

    在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也 ...

  10. 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法

    废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...

最新文章

  1. C++逆流而上,Java 惨不忍睹 | 9月编程语言排行
  2. boost::signals2::slot相关的测试程序
  3. 【下一代核心技术DevOps】:(三)私有代码库阿里云Git使用
  4. 内存中绘图 Memdc
  5. Java -----JVM运行时数据区
  6. mybatis 中 Example 的使用 :条件查询、排序、分页(三种分页方式 : RowBounds、PageHelpler 、limit )
  7. LeetCode 311. 稀疏矩阵的乘法
  8. Android官方开发文档Training系列课程中文版:网络操作之网络连接
  9. PreScan中对象沿预设轨迹运动的若干方式介绍
  10. 作品上传设计师交流社区,从而获得很好的传播效果
  11. linux下c获系统内存的函数,linux下c编程之内存共享shemget函数的实现及案例-bmi体重身高测试2...
  12. 专访京东副总裁翁志:全方位解读 CNCC 2018「数据开创商业新生态」技术论坛 | CNCC 2018...
  13. 从零开始学习python编程-从零开始学python编程一:首行代码
  14. python基础系列教程——Python3.x标准模块库目录
  15. 基于jquery的文件上传-uploadify资料收集
  16. react native 项目使用 expo 二维码扫描失败
  17. matlab教程分析,MATLAB数据分析教程
  18. 史上最后一位数学全才——庞加莱
  19. 决战行测5000题-数量关系精华版
  20. Android亮度调节

热门文章

  1. 数据结构1——堆栈和队列
  2. UML类图、代理学习
  3. tigase关闭damain的匿名认证(anonymous authentication)
  4. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
  5. 太原理工计算机组成原理报告,太原理工计算机组成原理考试题.pdf
  6. [2018.03.29 T2] 公交旅行
  7. BZOJ1027[JSOI2007] 合金
  8. matlab中unique的作用,matlab中的unique函数详解
  9. 网页设计图片向上浮动_CSS实现图片向上浮动
  10. python是免费的、开源的、跨平台的_NovalIDE是一款开源,跨平台,而且免费的国产Python IDE。...