AJAX原理及XMLHttpRequest对象分析
今天的主题是前端都了解的AJAX,但其中都有哪些知识点,还需要深入分析。
首先揭示AJAX的字面意思,Asynchronous Javascript And XML,通俗点就是“异步Javascript和XML”。
那有同步的吗?曾经的form提交并转到另一个页面刷新就是这种‘同步’的案例,有了AJAX后,便可以实现网页不提交(刷新)更新网页内容。
其实质便是依赖异步的Javascript请求网络,响应返回后,通过Javascript操作DOM接口更新HTML节点内容。
而这个能够实现异步的Javascript对象便是XMLHttpRequest。
真正实现异步的并不是XMLHttpRequest对象本身,而且浏览器内核会针对XHR对象的请求另起一个线程进行处理,处理完成后将回调对象放入JS队列。
下面介绍一些XMLHttpRequest对象的基本内容。
XMLHttpRequest对象在W3C标准下提供了很多属性。其中包括:
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
onreadystatechange 用于监听readyState状态变化
reponseText 响应返回文本
reponseXML 响应格式化为XML返回内容
status HTTP状态码
statusText HTTP状态码文本值
readyState XMLHttpRequest对象的状态
上述这些都是经常用到的属性,其中两个状态值再分类描述一下:
status:HTTP状态码
1xx:服务器临时响应
2xx:服务器成功响应
3xx:服务器重定向
4xx: 客户端请求错误
5xx: 服务器内部错误
readyState :
0:XMLHttpRequest对象已实例化,但未初始化open
1:对象已初始化open,但未send
2:对象已send,但status状态未知
3:对象已接收到部分数据
4:对象成功接收完成数据
通过上面介绍之后,我们可以利用XMLHttpRequest来实现一段异步请求并刷新局部页面的功能。
这里不考虑XMLHttpRequest在浏览器间的兼容性。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.state == 200){
handleHTML(xhr.responseText);
}
}
xhr.open('get', url, true);
xhr.send();
上例就是一个简单的XMLHttpRequest对象使用。还可以使用post方式实现类似form数据的提交。
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.state == 200){
handle(xhr.responseText);
}
}
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("param1=1¶m2=2");
上面是XMLHttpRequest Level 1的一些使用方式。虽然功能简单,但是解决了早期很多问题,主要包括:
1.XMLHttpRequest是异步的,请求无需等待,可以提供良好的体验;
2.无需刷新页面,可提高网页加在效率,降低服务器压力;
3.解决了以往需要依靠隐藏iframe实现异步请求的问题。
但是依然存在一些缺陷,比如:
1.受到同源策略的限制,无法实现跨域请求;
2.无法实现文件的上传及其进度;
3.无法获取服务器二进制数据;
4.自身不支持超时处理。
针对上述问题,Level 2还未出来前,前端一直采用特殊的作法,针对每一点:
1.采用JSONP,即<script>标签避开同源策略,实现跨域请求(JSOP知识点有可扩展空间)
2.未知
3.修改mimeType将二进制数据伪装成text,然后再代码中还原二进制数据(mimeType: 'text/plain; charset=x-user-defined')
4.添加setTimeout处理
但Level 2出来以后,上述这些问题都已解决,而且扩展了一下属性:
1.responseType/response,可支持二进制数据,ByteArray/Blob/File;
2.添加了xhr.upload对象,支持上传,还有progress事件可监听上传下载进度。
下面针对上传贴出一个小例子,在此基础上配合服务器编程可实现大文件断点续传。
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.onload = function (e){
// 当前文件块上传完,可开始上传下一块
}
xhr.upload.onprogress = function(e){
// e.loaded 当前文件块上传字节数
// e.totalSize 当前文件块总字节数
}
// 可设置一定超时,如果超时可调节发次发送的文件块大小
xhr.send(trunck);
以上是对XMLHttpRequest对象的大概分析,其规范中包括大量属性和接口,请参考对应内容。
AJAX原理及XMLHttpRequest对象分析的更多相关文章
- Ajax技术---核心XMLHttpRequest对象
Ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. (一)ajax技术的意义 我 ...
- Ajax中的XMLHttpRequest对象详解
XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...
- ajax原理和XmlHttpRequest对象
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得请求数据.要清楚这 ...
- Ajax中的XMLHttpRequest对象详解(转)
XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...
- $.ajax通用格式&&XMLHttpRequest对象属性和方法
$.ajax({ url: "", type: "POST", async: false, cache:false, //默认true data: {}, da ...
- AJAX的核心XMLHttpRequest对象
为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,jQuery,Css...)重新融合程一个新的知识框架.而XMLHttpRequest对象则是其中的重 ...
- Ajax异步请求XMLHttpRequest对象Get请求
$(function () { $("#btnGetDate").click(function () { var xhr; //第一步:创建异步请求的核心的对象: if (XMLH ...
- 原生Ajax XMLHttpRequest对象
一.Ajax请求 - 现在常见的前后端分离项目中,一般都是服务器返回静态页面后浏览器加载完页面,运行script中的js代码,通过ajax向后端api发送异步请求获取数据,然后调用回调函数,将数据添加 ...
- AJAX 原理(转摘)
在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...
随机推荐
- 5、利用控件TVCLZip和TIdFTP压缩文件并上传到FTP的线程单元pas 改进版
用到临界区 保护写日志的函数: 递归函数 删除目录下的所有文件: 循环创建或判断FTP的目录: 可改进的地方:循环压缩深层次目录的所以文件: 实现断点续传,或断点下载: {************** ...
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 移动端H5页面之iphone6的适配(转)
iphone6 及 iphone 6 plus 已经出来一段时间了.很多移动端网站,以前写死body 为320px的,现在估计也忙着做适配了. 大屏幕手机其实一直有,只是以前大家没怎么重视,移动端的H ...
- 20145308刘昊阳 《Java程序设计》第8周学习总结
20145308刘昊阳 <Java程序设计>第8周学习总结 教材学习内容总结 第15章 通用API 15.1 日志 15.1.1 日志API简介 java.util.loggging包提供 ...
- 《DON'T MAKE ME THINK》/《点石成金访客至上的网页设计秘笈》 读书笔记
1.web页面要尽可能简单,让用户不用思考就能知道页面的功能,如果要进行一些崭新的.开拓性的或者非常复杂的页面设计时, 此时要利用页面元素的外观.精心选择的名称.页面布局以及少量仔细斟酌过的文字,使页 ...
- 【BZOJ】1086: [SCOI2005]王室联邦
http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题意:n个点的树,要求分块,使得每一块的大小在[b, 3b]内且块与某个点形成的块是连通的(某 ...
- POJ 1654 Area(水题)
题目链接 卡了一下精度和内存. #include <cstdio> #include <cstring> #include <string> #include &l ...
- 【noiOJ】p6253
t6253:用二分法求方程的根 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 用二分法求下面方程在(-10, 10)之间的一个根. 2x3- 4x2+ 3x ...
- 【JAVA】Quartz 任务调度和异步执行器
Quartz基础结构 Quartz对任务调度的领域问题进行了高度抽象,提出了调度器(Scheduler).任务(Job)和触发器(Trigger)这3个核心概念,并在Trigger触发 ...
- GO语言练习:多返回值函数
1.代码 2.运行 1.代码 package main import ( "fmt" "strconv" ) func getValue(n int) (flo ...