使用XMLHttpRequest
请求种类
通过XMLHttpRequest的请求可以通过同步和异步的方式获取数据,请求的种类在XMLHttpRequest的open()方法的第三三个可选参数async设置。如果这个参数是true或者没有特别指定,那么XMLHttpRequest讲师异步,否则将是同步传输。总而言之,你要尽可能的少使用同步传输。
处理response
responseXML 属性
如果你使用XMLHttpRequest来获取远程的XML文档的内容,那么responseXML属性将返回一个DOM对象,此对象包含了一个被解析的XML文档,这个文档难解析和计算。下面5大主要的方法来处理这个XML文档:
- 使用 XPath 来强调(指向)部分内容。
- 使用 JXON 将其转化成Javascript对象树
- 手动的解析或者序列化XML成为字符串亦或对象。
- 使用 XMLSerializer 来序列化DOM树变成strings亦或files
- RegExp可以被使用如果你提前知道了XML文档的内容。 如果你想去掉换行符,你可以使用正则来扫描换行符,但是这是不得已才能使用的方法,因为XML文档中的细微改变将会导致该方法的失败。
responseText 属性包括了 HTML 文档
如果你使用XMLHttpRequest来获取远程HTML文件的内容,那么responseText属性是一个包含了一系列HTML标签的字符,难解析和计算。
下面三个方法可以用来处理:
- 使用XMLHttpRequest.responseXML属性
- 使用fragment.body.innerHTML将内容注入到一个document fragment的主体中
- 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进行数据转换时发送的事件。
进程事件存在于下载和上传传输事件中。下载事件在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();
file: 中不可以使用。Note: 从 Gecko 9.0 开始,进度事件现在可以依托于每一个传入的数据块,包括进度事件被触发前在已经接受了最后一个数据包且连接已经被关闭的情况下接收到的最后一个块。这种情况下,当该数据包的 load 事件发生时 progress 事件会被自动触发。这使你可以只关注 progress 事件就可以可靠的监测进度。
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
- 使用
FormDataAPI
第二种方式( 使用 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.
使用XMLHttpRequest的更多相关文章
- JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)
1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...
- AJAX的核心XMLHttpRequest对象
为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,jQuery,Css...)重新融合程一个新的知识框架.而XMLHttpRequest对象则是其中的重 ...
- XMLHTTPRequest对象的创建与浏览器的兼容问题
MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...
- 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
前端JS中使用XMLHttpRequest 2上传图片到服务器,PC端和大部分手机上都正常,但在少部分安卓手机上上传失败,服务器上查看图片,显示字节数为0.下面是上传图片的核心代码: HTML < ...
- Ajax 与 XmlHttpRequest
AJAX描述了确保Web应用在Web服务器请求新数据的情况下也能(几乎)实时反应的一种方法.具体地说,AJAX只是一些建立已久的技术的相互作用,从HTML.XHTML和HTTP,到JavaScript ...
- js中XMLHttpRequest对象实现GET、POST异步传输
js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...
- AJAX初探,XMLHttpRequest介绍
AJAX初探,XMLHttpRequest介绍 AJAX AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML. AJ ...
- 大熊君学习html5系列之------XHR2(XMLHttpRequest Level 2)
一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻……,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...
- 手动封装js原生XMLHttprequest异步请求
Code Object.extend =function(targetObj,fnJson){ //扩展方法,类似于jQuery的$.extend,可以扩展类的方法,也可以合并对象 for(var f ...
- XMLHttpRequest对象用法
xmlhttprequest is what? 用户后台与服务器交换数据. 可以在不重新加载页面的情况下更新网页: 在页面已加载后从服务器请求数据: 在页面已加载后从服务器接收数据: 在后台向服务器发 ...
随机推荐
- SQL-基础学习使用的数据库资料
-- ------------------------ Create Customers table-- ----------------------CREATE TABLE Customers( c ...
- Redis绑定多个ip地址
Redis绑定多个ip地址 学习了:https://www.zhihu.com/question/20346112/answer/17157379 注意,用空格进行分隔 bind 127.0.0.1 ...
- 关于Oracle中sysoper这个系统权限的问题
我们都知道Oracle数据库安装完之后.默认的会有这样几个系统角色或权限.nomal,sysdba,sysoper等等,之前每次登录Oracle的时候.都是直接以conn / as sysdba 的身 ...
- ios You app information could not be saved. Try again. If the problem persists, contact us
ios You app information could not be saved. Try again. If the problem persists, contact us 大概意思:你的a ...
- javascript变量初始化位置
变量在之前<script type="text/javascript"></script>(或引用的js文件)中初始化,可以正常访问. 运行程序:弹出123 ...
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- nightwatch testing 注意事项
coding style 好的測試項目應該盡量不要使用pause 並且要有驗證的機制 .click('input.btn') //.pause(3000) .waitForElementVisible ...
- 《C程序猿:从校园到职场》出版预告(4):从“散兵游勇”到“正规部队”
看过电视剧<楚汉传奇>的朋友应该对这个场景还有印象:当刘邦第一次去找项羽帮忙的时候.他们一行人看到了项羽军营是怎样练兵的.想到自己练兵的方法,当时就震惊了."刘家军"就 ...
- 3D打印技术之切片引擎(4)
[此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 这一篇文章我讲一下多边打印的问题,多边打印是切片引擎的一项关键的技术. 图1 双边打印 首先.它能 ...
- idea刷新项目、清除项目缓存
点击File -> Invalidate caches ,点击之后在弹出框中点击确认,之后软件就自动重启了