AJAX
即“Asynchronous javascript And xml”(异步Javascript和XML)
,是指一种创建交互式网页应用的网页开发技术。
AJAX只是是一个前端技术,不是一个新的语言。它是利用浏览器提供操作HTTP
的接口(xmlhttpRequest
或者ActiveXObject
)来操作HTTP
以达到异步的效果。
HTTP
操作HTTP
操作。HTTP (HyperText Transfer PRotocol) 超文本传输协议 在当前web环境中走的流量大部分都是走的HTTP
流量,也就是说你在浏览器中访问任何东西,那怕是一张小图片也是HTTP
来给你当搬运工显示在你面前的。而且AJAX就是基于HTTP来传输数据的。所以要想精通AJAX,适当的了解并掌握HTTP是十分必要的。
web内容都是存储在web服务器上的,web服务器所使用的是http协议,因此经常会被称为http服务器。这些http服务器存储量因特网中的数据,如果http客服端发出请求的话,它们会提供数据。客户端向服务器发送http请求,服务器会在http响应中会送所请求的数据。http客服端和http服务器共同构成了万维网的基本组建。可能你每天都是使用http客服端。最常见的http客户端就是浏览器。web浏览器向服务器请求http对象,并将这些对象显示在你的屏幕上。
一个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信时通过名为HTTP message
的格式化数据块进行的。只有当请求和响应都成功时此http事务才算成功,也就是这条http才算成功。只有当其中任意一个命令(请求或者响应)失败,那么这个http就算失败。一个http就是一个http事务,且http事务完成之后此http不可在复用。
http报文是由一行一行的简单字符串组成的。http报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。http报文分为三部分:
- 起始行报文的第一行就是起始行,在请求报文中用来说明做些什么,在响应报文中说明出现了什么情况。
- 首部字段起始行后面有零个或多个首部字段。每个首部字段都包含了一个名字和一个值,首部分为5种类型:
通用首部、请求首部、响应首部、实体首部、扩展首部
- 主体报文主体包含了所有类型的数据。请求主体中报错了要发送给web服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部字段都是结构化的文本形式的,而主体可以包含任意的二进制数据。当然,主体中也可以包含文本。
http支持几种不同的请求命令,这些命令被称为http方法
每条http请求报文都包括一个方法。这个方法会告诉服务器执行什么动作(获取一个web页面、运行一个网关程序、删除一个文件)。
常见来http方法如下
- GET 从服务器向客户端发送命名资源,主要是传给服务器一些参数来获取服务器上指定的资源。
- POST 将客户端数据发送到一个服务器网关程序。
- DELETE 从服务器上删除命名资源
- HEAD 仅发送命名资源中的http首部
- PUT 将来自客户端的数据存储到一个服务器资源中去
- TRACE 对报文进行追踪
- OPTIONS 决定可以从服务器上执行哪些方法
GET与POST的区别:
每条http响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他操作。几种常见的状态码:
- 200 OK 文档正确返回
- 301 Redirect 永久重定向。一直从其他地方去获取资源
- 302 Redirect 临时重定向。临时到其他地方去获取资源
- 303 see other、307 Temporary Redirect 将客服端重定向到一个负载不大的服务器上,用于负载均衡和服务器失联
- 404 Not Found 无法找到这个资源
- 500 Internal Server Error 服务器错误
伴随着每个数字状态码,http还会发送一条解释性的原因短语
文本。包含文本短语主要是为了进行描述,所有的处理过程使用的都是数字码。http软件处理下列状态码和原因短语的方式是一样的:
- 200 OK
- 200 Document attached
- 200 Success
- 200 All's cool, dude
因特网上有数千种不同的数据类型,http仔细地给每种要通过web传输的对象都打上了名为MIME类型(MIME Type)的数据格式标签。最初设计MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展) 是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。MIME在电子邮件系统中工作得非常好,因此HTTP也采纳了它,用它来描述并标记多媒体内容。web服务器会为所有的http对象数据附加一个MIME类型。当web浏览器从服务器中取回一个对象时,回去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。大多数浏览器都可以处理数百种常见的对象类型。MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
text/html
类型来标记text/plain
类型来标记image/jpeg
类型image/gif
类型MIME类型在HTTP协议中的表现为Request Header
或者Response Header
中的Content-Type
还有Content-length
URI : 每个web服务器资源都有一个名字,这样客户端就可以说明他们感兴趣的资源是什么了。服务器资源名被称为
统一资源标识符(Uniform Resource Identifier,URI)
URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。例如 https://www.baidu.com/img/baidu_jgylogo3.gif这是一个百度服务器上一个图片资源的URI
URL :
统一资源定位符(URL)
是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置。它们可以明确说明如何从一个精确、固定的位置获取资源。例如 :https(http协议)://www.baidu.com(进入百度服务器)/img/baidu_jgylogo3.gif(获取路径为/img/baidujgylogo3.gif的图片)大部分的URL都遵循一种标准格式,这种格式分为三部分。
- 第一部分
方案(scheme)
,说明了访问资源所使用的协议类型。着部分通常就是http协议。- 第二部分 服务器位置,给出来服务器的因特网地址(比如,www.baidu.com)。
- 第三部分 资源路径,指定了web服务器上的某个资源(比如,/img/baidujgylogo3.gif)。现在,几乎所有的URI都是URL大多数的URL方案的URL语法都建立在这个有9部分构成的通用格式上:
<scheme>://<user>:<passWord>@<host>:<port>/<path>;<params>?<query>#<frag>
URN :
URI
的第二种形式就是统一资源名称(URN)
。URN是作为特定内容的唯一名称使用的,与目前资源地无关。使用这些与位置无关的URN>,就可以将资源四处搬移。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。比如,不论因特网标准文档RFC 2141 位于何处(甚至可以将其复制到多个地方),都可以用下列URN来命名它:urn:ietf:rdc:2141
URN目前仍然处于试验阶段。
URI包括两种形式,一种是URL一种是URN。目前大部分会不加区别的使用URI和URL。因为URL是URI的一个子集。
方案
实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析URL的应用程序应该使用什么协议,最常见的就是HTTP方案。常见的方案格式:
- http 超文本传输协议方案,默认端口为80
- https 方案https和方案http是一对,为一个区别在于使用了网景的SSL,SSL为http提供了端到端的加密机制。默认端口为443
- mailto 指向Email地址。
- ftp 文件传输协议,可以用来从ftp服务器上传下载文件
- file 访问本地文件
- telnet 用于交互式访问业务
在IE8以下版本的IE系列浏览器中,要应用AJAX必须使用ActiveXObject(这个对象是一个微软推广和支持在Internet Explorer中,不在Windows应用商店的应用程序。)
方法。在标准浏览器(chrome、firefox、Opera、safari、ie7+)当中则使用XMLHttpRequest
对象。
在低版本IE(8-)中使用ActiveXObject
构造AJAX对象时需要传入一个String类型的参数Microsoft.XMLHTTP
,也可以使用Msxml3.XMLHTTP
和Msxml2.XMLHTTP
。因为一开始是Microsoft.XMLHTTP
之后变成Msxml2.XMLHTTP
及更新版的Msxml3.XMLHTTP
// code for IE6, IE5 var xmlhttp1 = new ActiveXObject("Microsoft.XMLHTTP"); var xmlhttp2 = new ActiveXObject("Msxml2.XMLHTTP"); var xmlhttp3 = new ActiveXObject("Msxml3.XMLHTTP");
在标准浏览器中则使用XMLHttpRequest
对象
// code for IE7+, Firefox, Chrome, Opera, Safarivar xmlhttp = new XMLHttpRequest();
为了在项目中可以在任何浏览器中使用AJAX所以我们必须做一个判断,如果浏览器为低版本ie就是用ActiveXObject
对象否则使用XMLHttpRequest
对象。代码如下:
var XHR = function () { var xmlhttp; if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } return xmlhttp; };var xmlObj=XHR();console.log(xmlObj);
这样的话,我们就可以得到一个在任何浏览器都能发起AJAX的方法。但是这样左右一个坏处,就是每次获取AJAX对象时都会判断一次,这样做很费时费力。所以,我们利用惰性函数
的概念来实现一个只需要第一次判断,后面都不需要判断的方法。
var XHR = function () { //将浏览器支持的AJAX对象放入一个function中,并且根据固定的顺序放到一个队列里。 for (var AJAXObj = [function () { return new XMLHttpRequest }, function () { return new ActiveXObject("Msxml2.XMLHTTP") }, function () { return new ActiveXObject("Msxml3.XMLHTTP") }, function () { return new ActiveXObject("Microsoft.XMLHTTP") }], val = null, index = 0; index < AJAXObj.length; index++) { //此方法的核心,如果当前浏览器支持此对象就用val保存起来,用保存当前最适合ajax对象的function替换XHR方法,并且结束该循环。这样第二次执行XHR方法时就不需要循环,直接就能得到当前浏览器最适ajax对象。如果都不支持就抛出自定义引用错误。 try { val = AJAXObj[index]() } catch (b) { continue } //假设当前浏览器为标准浏览器,此处执行完毕之后console.log(XHR); //结果为:function () { // return new XMLHttpRequest //};XHR成功替换。 XHR=AJAXObj[index]; br
新闻热点
疑难解答