今天的主题是前端都了解的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&param2=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对象分析的更多相关文章

  1. Ajax技术---核心XMLHttpRequest对象

    Ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发中采用的同步的方式. (一)ajax技术的意义 我 ...

  2. Ajax中的XMLHttpRequest对象详解

    XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...

  3. ajax原理和XmlHttpRequest对象

    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得请求数据.要清楚这 ...

  4. Ajax中的XMLHttpRequest对象详解(转)

    XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...

  5. $.ajax通用格式&&XMLHttpRequest对象属性和方法

    $.ajax({ url: "", type: "POST", async: false, cache:false, //默认true data: {}, da ...

  6. AJAX的核心XMLHttpRequest对象

    为了实现异步通讯,提高用户体验度,而将很多旧知识(XML,DOM,JavaScript,HTML,jQuery,Css...)重新融合程一个新的知识框架.而XMLHttpRequest对象则是其中的重 ...

  7. Ajax异步请求XMLHttpRequest对象Get请求

    $(function () { $("#btnGetDate").click(function () { var xhr; //第一步:创建异步请求的核心的对象: if (XMLH ...

  8. 原生Ajax XMLHttpRequest对象

    一.Ajax请求 - 现在常见的前后端分离项目中,一般都是服务器返回静态页面后浏览器加载完页面,运行script中的js代码,通过ajax向后端api发送异步请求获取数据,然后调用回调函数,将数据添加 ...

  9. AJAX 原理(转摘)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...

随机推荐

  1. Dependency Injection in ASP.NET Core

    Transient – A new instance of the service is created each time it is requested. It can be used for s ...

  2. Shell 编程基础之 If 练习

    一.语法 if [ condition ]; then # 当 condition 成立时,执行内容: fi # 将 if 反过来写,fi 结束 if 之意 if [ condition ]; the ...

  3. iOS之07-三大特性之多态 + NSString类

    多态 1.没有继承就没有多态 2.代码体现:父类类型的指针指向子类对象 类的创建: #import <Foundation/Foundation.h> // 动物 @interface A ...

  4. iOS学习01C语言数据类型

    1.注释 // 单行注释 // 注释对代码起到解释说明的作用,注释是给程序员看的,不参与程序运行 /*  多行注释  Xcode快捷键  全选 cmd+a  复制 cmd+c  粘贴 cmd+v  设 ...

  5. Storm和JStorm(阿里的流处理框架)

    本文导读: 1.What——JStorm是什么? 1.1 概述 .2优点 .3应用场景 .4JStorm架构 2.Why——为什么启动JStorm项目?(与storm的区别) .1storm的现状.缺 ...

  6. next_permutation函数

    这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>下面是以前的笔记    与之完全相反的函数还有prev_permutation  (1) int 类 ...

  7. jquery delay()介绍及使用指南

    .delay()是用来在jQuery动画效果和类似队列中是最好的.但是,由于其本身的限制,比如无法取消延时——.delay(),它不是JavaScript的原生 setTimeout函数的替代品,这可 ...

  8. iOS 项目中用到的一些开源库和第三方组件

    iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...

  9. [LintCode] Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head.   Example Given 1->2-> ...

  10. WebApp 里Meta标签大全,webappmeta标签大全

    1.先说说mate标签里的viewport: viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏.状态栏.滚动条等等之后用于看网页的区域.对于传统WEB页面来说,9 ...