篆体字网 > 知识库

ajax原理

来源:篆体字网 2023-12-26 18:42:54 作者:篆字君

AJAX是异步的JavaScript和XML(Asynchronous JavaScript And XML)。简单点说,就是使用 对象与服务器通信。 它可以使用JSON,XML,HTML和文本等多种格式发送和接收。AJAX最吸引人的就是它的“异步”特性,也就是说他可以在不重新刷新页面的情况下与服务器通信,交换数据,更新页面。

你可以使用AJAX最主要的两个特性做下列事:

在不重新加载页面的情况下发送请求给服务器。

接受并使用从服务器发来的数据。

工作原理

Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

发送Http请求

为了使用JavaScript向服务器发送一个http请求,你需要一个包含必要函数功能的对象实例。这就是为什么会有 的原因。 这是IE浏览器的ActiveX对象 的前身。 随后Mozilla,Safari和其他浏览器也都实现了类似的方法,被称为 。同时,微软也实现了XMLHttpRequest方法。

// Old compatibility code, no longer needed.

if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...

httpRequest=new XMLHttpRequest();

}

else if (window.ActiveXObject) { // IE 6 and older

httpRequest=new ActiveXObject('Microsoft.XMLHTTP');

Note:上面代码只是简单版的如何创建一个XMLHttp实例。更实际的例子,请看本篇文章下方简单例子。

发送一个请求后,你会收到响应。在这一阶段,你要告诉XMLHttp请求对象是由哪一个JavaScript函数处理响应,在设置了对象的 属性后给他命名,当请求状态改变时调用函数。

httpRequest.onreadystatechange=nameOfTheFunction;

要注意的是,函数名后没有参数,因为你把一个引用赋值给了函数,而不是真正的调用了它。 此外,如果不使用函数名的方式,你还可以用JavaScript的匿名函数响应处理的动作,就像下面这样:

httpRequest.onreadystatechange=function(){

// Process the server response here.

};

接下来,声明当你接到响应后要做什么,你要发送一个实际的请求,通过调用HTTP请求对象的 open() 和 send() 方法,像下面这样:

httpRequest.open('GET', 'http://www.example.org/some.file', true);

httpRequest.send();

的第一个参数是HTTP请求方法 - 有GET,POST,HEAD以及服务器支持的其他方法。 保证这些方法一定要是大写字母,否则其他一些浏览器(比如FireFox)可能无法处理这个请求。更多关于HTTP的请求方法,可以查看 W3C 文档哈。

第二个参数是你要发送的URL。由于安全原因,默认不能调用第三方URL域名。 确保你在页面中使用的是正确的域名,否则在调用 方法是会有 “权限被拒绝” 错误提示。如果你真的需要向另一个域名发送请求, 可以查看 HTTP access control,跨域问题将在后期文章发布。

第三个参数是可选的,用于设置请求是否是异步的。如果设为 (默认设置),JavaScript执行会持续,并且在服务器还没有响应的情况下与页面进行交互。

方法的参数可以是任何你想发送给服务器的内容,如果是 请求的话。发送表单数据时应该用服务器可以解析的格式,像查询语句:

'name=value&anothername="+encodeURIComponent(myVar)+'&so=on'

或者其他格式, 类似 ,JSON,XML等。

如果你使用 POST 数据,那就需要设置请求的MIME类型。比如,在调用 方法获取表单数据前要有下面这个:

httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

处理服务器响应

在发送请求时,你提供的JavaScript函数名负责处理响应:

httpRequest.onreadystatechange=nameOfTheFunction;

这个函数应该做什么?首先,函数要检查请求的状态。如果状态的值是 (对应的值是4),意味着服务器响应收到了并且是没问题的,然后就可以继续执行。

if (httpRequest.readyState===XMLHttpRequest.DONE) {

// Everything is good, the response was received.

}

else {

// Not ready yet.

}

全部readyState状态值可以查看书籍或者文档,如下也是:

0 (未初始化) or (请求还未初始化)

1 (正在加载) or (已建立服务器链接)

2 (加载成功) or (请求已接受)

3 (交互) or (正在处理请求)

4 (完成) or (请求已完成并且响应已准备好)

接下来,判断HTTP响应的 response code。 更多响应码可以查看W3C文档。在下面的例子中,我们通过检查响应码 区别对待成功和不成功的AJAX调用。

if (httpRequest.status===200) {

// Perfect!

}

else {

// There was a problem with the request.

// For example, the response may have a 404 (Not Found)

// or 500 (Internal Server Error) response code.

}

在检查完请求状态和HTTP响应码后, 你就可以用服务器返回的数据做任何你想做的了。你有两个方法去访问这些数据:

–服务器以文本字符的形式返回

– 以 XMLDocument 对象方式返回,之后就可以使用JavaScript来处理

注意上面这一步只在你发起异步请求时有效(既 的第三个参数未特别指定或设为 )。如果你你发起的是同步请求则不必使用函数,但是非常不推荐这样子做,它的用户体验很不好。

简单的例子

让我们把所有的知识都集中起来做一个简单的HTTP请求。这个JavaScript会请求一个HTML文档 ,包含 'I'm a test' 内容。然后我们 响应的内容。注意这个例子我们只是用了JavaScript,没有用jQuery。而且,HTML,XML和PHP文件都要放在用一个目录下。

上一篇:北京缓解拥堵网摇号结果查询

下一篇:2013年新交通规则

相关阅读