转自:http://segmentfault.com/a/1190000000691919

Ajax及其工作原理

AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡。

AJAX是不能跨域的,如需跨域,可以使用document.domain='a.com';或者使用服务器代理,代理XMLHttpRequest文件

AJAX是基于现有的Internet标准,并且联合使用它们:

  1. XMLHttpRequest 对象 (异步的与服务器交换数据)
  2. JavaScript/DOM (信息显示/交互)
  3. CSS (给数据定义样式)
  4. XML (作为转换数据的格式)

创建 XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。

创建Ajax对象:

  1. //IE6以上
  2. var oAjax = new XMLHttpRequest();
  3. //IE6
  4. var oAjax =new ActiveXObject("Microsoft.XMLHTTP")

连接服务器

  1. oAjax.open(方法,url,是否异步)

我们都知道,Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。所以,Ajax天生就是工作在异步模式的(异步为true,同步false)

同步和异步

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 
(简单点说:同步就是只能一件一件事的来做,而异步就是可以多件事同时进行)

发送请求send()

  1. <script type="text/javascript">
  2. function getDoc(){
  3. var xmlhttp;
  4. if(window.xmlhttpRequest){
  5. xmlhttp=new XMLHttpRequest();
  6. }
  7. else{
  8. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//for IE6
  9. }
  10. xmlhttp.onreadystatechange = function(){
  11. if(xmlhttp.readyState==4&&xmlhttp.status==200){
  12. document.getElementById("myId").innerHTML=xmlhttp.responseText;
  13. }
  14. }
  15. xmlhttp.open("GET", index.php,true);
  16. xmlhttp.send();
  17. }
  18. </script>
  19. </head>
  20. <body>
  21. <button type="button" onclick="getDoc()">请求数据</button>
  22. </body>

GET 还是 POST?

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。

然而,在以下情况中,请使用 POST 请求:

  1. 无法使用缓存文件(更新服务器上的文件或数据库)
  2. 向服务器发送大量数据(POST 没有数据量限制)
  3. 发送包含未知字符的用户输入时,POST GET 更稳定也更可靠

接收返回信息

  1. oAjax.onreadystatechange = function(){ //当请求状态改变时要调用的事件处理器
  2. alert(oAjax.readystate);
  3. }

只要readyState属性的值发生变化时,便会触发一次readyStatechange事件。可以利用这个事件来检测每次状态变化后readyState的值。通常,我们只对readyState值为4的阶段感兴趣,因为这时所有数据都已经就绪,不过,必须在调用open()之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性。下面来看一个例子:

  1. var xhr = createXHR();
  2. xhr.onreadystatechange = function () {
  3. if (xhr.readyState == 4) {
  4. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
  5. alert(xhr.statusText);
  6. } else {
  7. alert("Request was unsuccessful: " + xhr.status);
  8. }
  9. }
  10. };
  11. xhr.open("get", "example.txt", true);
  12. xhr.send(null);

XHR对象

XMLHttpRequest这个对象的属性:

它的属性有:

  1. onreadystatechange 每次状态改变所触发事件的事件处理程序。
  2. responseText 从服务器进程返回数据的字符串形式。
  3. responseXML 从服务器进程返回的DOM兼容的文档数据对象。
  4. status 从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪)
  5. status Text 伴随状态码的字符串信息

当XHR对象把一个HTTP请求发送到服务器的过程中会经历几个状态,直到请求被处理,然后才接收一个回应。readyState就是XHR请求的状态属性,它本身有5个属性值:

  1. 0(未初始化)还没有调用open()方法
  2. 1(载入)已调用send()方法,正在发送请求
  3. 2(载入完成)send()方法完成,已收到全部响应内容
  4. 3(解析)正在解析响应内容
  5. 4(完成)响应内容解析完成,可以再客户端使用了

http状态码

1字头:消息。这一类型的状态码,代表请求已被接受,需要继续处理。
2字头:成功。这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
3字头:重定向。这类状态码代表需要客户端采取进一步的操作才能完成请求。
4字头:客户端错误。这类状态码代表了客户端看起来可能发生错误,妨碍了服务器的处理。
5字头:服务器错误。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

另附:http状态码详解
w3cschool HTTP 状态消息:http://www.w3school.com.cn/tags/htmlrefhttpmessages.asp

status和statusText

  statusText是响应返回的文本信息,仅当readyState值为3或4的时候才能使用。当readyState为其它值时视图存取statusText属性将引发异常。

XHR的方法

| 方法 | 描述 | 
| ------------- |:-------------:| 
| abort() | 导致当前正在执行的请求被取消 | 
| getAllResponseHeaders() | 返回包含所有响应头的名称和值的单个字符|串 | 
| getResponseHeader(name) | 返回响应头中指定的名称和值 | 
| open(method,url,async,username,pwd) | 设置HTTP方法(get或post)等 | 
| send(content) | 发出带有指定主体内容的请求|
| setRequestHeader(name,value) | 使用指定的名称和值设置请求头 |

<br/>

  1. <script type="text/javascript">
  2. var oAjax =oAjax();
  3. alert(oAjax.readyState);//弹出"0"
  4. oAjax.open("get","index.html",true);
  5. alert(oAjax.readyState);//弹出"1"
  6. oAjax.send(null);
  7. alert(oAjax.readyState);//IE下弹出4,而firefox是2
  8. //可以通过readystatechange事件监听
  9. oAjax = XHR();
  10. oAjax.onreadystatechange = function () {
  11. alert(oAjax.readyState);//Firefox下依次是1,2,3,4但最后还会再来个1
  12. //IE下则是1,1,3,4
  13. };
  14. oAjax.open("get","index.txt",true);
  15. oAjax.send(null);
  16. </script>

jQuery中的Ajax

.load()方法是局部方法,因为他需要一个包含元素的jQuery对象作为前缀,而$.get()$.post()是全局方法,无需指定某个元素,对于用途而言,.load()适合做静态文件的异步获取,而对于需要传递参数到服务器页面的,$.get()$.post()更加合适。

  1. $(function () {
  2. $("input").click(function () {
  3. $.get('test.php?url=baidu.com', function (response,status,xhr) {
  4. $('#box').html(response);
  5. })
  6. })
  7. });

POST提交不能使用url传参。post提交可以使用字符串形式的键值对形式传参,自动转换为http消息实体传参

  1. $(function () {
  2. $("input").click(function () {
  3. $.post('test.php','url=baidu.com', function (response,status,xhr) {
  4. $('#box').html(response);
  5. })
  6. })
  7. });
  1. //post提交可以使用对象键值对
  2. $(function () {
  3. $("input").click(function () {
  4. $.post('test.php',{
  5. url:'baidu.com'//post提交可以使用对象键值对
  6. }, function (response,status,xhr) {
  7. $('#box').html(response);
  8. })
  9. })
  10. });

$.get()方法有四个参数,前面三个参数和.load()一样,多了一个第四参数type,即服务器返回的内容格式,包括xml,json,script,html,text等,第一个参数为必选参数,后面三个为可选参数

$.ajax()是所有Ajax方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装,这个方法只有一个参数,传递一个
各个功能键值对的对象。

$.ajax()方法对象参数列表

参数 类型 说明
url string 发送请求的地址
type string 请求方法,默认GET
timeout Number 设置请求超时的时间
data Object或String 发送到服务器的对象,键值对字符串或对象
datatype String 返回的数据类型,比如html,XML,json等
success Function 请求成功后调用的回调函数
complete Function 请求完成后调用的回调函数
error Function 请求失败后调用的回调函数
  1. $(function () {
  2. $("input").click(function () {
  3. $.ajax({
  4. type : "POST",
  5. url: 'test.php',
  6. data:{
  7. url: 'baidu.com'
  8. },
  9. success : function(response,status,xhr){
  10. $('#box').html(response);
  11. }
  12. })
  13. })
  14. });

表单序列化

Ajax用的最多的地方莫过于表单操作,而传统的表单操作是通过submit提交将数据传输到服务器,如果使用Ajax异步处理
的话,我们需要将每个表单元素获取才能提交,这样工作效率就大大降低

  1. <body>
  2. <form action="">
  3. 用户名: <input type="text" name="user" />
  4. 邮件: <input type="text" name="email" />
  5. <input type="button" value="提交"/>
  6. </form>
  7. <div id="box"></div>
  8. <script type="text/javascript">
  9. $(function () {
  10. $("form input[type=button]").click(function () {
  11. $.ajax({
  12. type: 'POST',
  13. url: 'test.php',
  14. data: {
  15. user: $('form input[name=user]').val(),
  16. email: $("form input[name=email]").val(),
  17. },
  18. success: function(response){
  19. $("#box").html(response);
  20. }
  21. })
  22. })
  23. });
  24. </script>
  25. </body>

表单元素特别多的情况下应采用表单序列化,即data:$(“form”).serialize();//得到的是字符串键值对,并且对url进行编码

serialize()方法不但可以序列化表单内的元素,还可以直接获取单选框,复选框和下拉列表框等内容

  1. <body>
  2. <form action="">
  3. 用户名: <input type="text" name="user" />
  4. 邮件: <input type="text" name="email" />
  5. <input type="button" value="提交"/>
  6. <input type="radio" name="sex" value="男"/>
  7. <input type="radio" name="sex" value="女"/>
  8. <input type="button" value="submit"/>
  9. </form>
  10. <div id="box"></div>
  11. <script>
  12. $(function () {
  13. $("form input[name=sex]").click(function () {
  14. $('#box').html(decodeURIComponent($(this).serialize()));
  15. })
  16. })
  17. </script>
  18. </body>

传统Ajax问题

传统的ajax有如下的问题:

  1. 1、可以无刷新改变页面内容,但无法改变页面URL
  2. 2、为了更好的可访问性,内容发生改变后,通常改变URLhash
  3. 3hash的方式不能很好的处理浏览器的前进、后退等问题
  4. 4、进而浏览器引入了onhashchange的接口,不支持的浏览器只能定时去判断hash是否改变
  5. 5、但这种方式对搜索引擎很不友好
  6. 6twittergoogle约定了使用#!xxx(即hash第一个字符为!),搜索引擎进行支持。

JavaScript学习总结(七)Ajax和Http状态字的更多相关文章

  1. arcgis api for javascript 学习(七) 调用发布地图信息,并将地图属性信息输出到Excel表格---进阶版

    我们在arcgis api for javascript 学习(三)已经学习到了关于调用地图信息进行属性输出的问题,不过通过代码我们实现后会发现还是有一些小瑕疵的,比如我们只能单个数据属性的输出,如果 ...

  2. JavaScript学习总结 Ajax和Http状态字

    Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡. AJAX是不能跨域的,如需跨域,可以使用document.domain= ...

  3. JavaScript学习总结(七)——ECMAScript6(ES6)

    一.ECMAScript概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通 ...

  4. JavaScript学习总结(七)——JavaScript函数(function)

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...

  5. JavaScript学习 - 基础(七) - DOM event(事件)

    DOM event(事件) 定义事件: // 定义事件: //方式一,直接在标签上定义事件 // 方式二: var a11 = document.getElementsByName('a11')[0] ...

  6. JavaScript学习(七)

  7. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  8. JavaScript学习总结——转

    JavaScript学习总结(一)——JavaScript基础 JavaScript学习总结(二)——逻辑Not运算符详解 JavaScript学习总结(三)——逻辑And运算符详解 JavaScri ...

  9. 前端学习 第七弹: Javascript实现图片的延迟加载

    前端学习 第七弹: Javascript实现图片的延迟加载 为了实现图片进入视野范围才开始加载首先: <img    src="" x-src="/acsascas ...

随机推荐

  1. winform程序常用图标网站及资源

    1.easyicon网站,免费下载 https://www.easyicon.net/ 2.findicons https://findicons.com/ 3.iconarchive http:// ...

  2. 吴裕雄--天生自然 JAVA开发学习:正则表达式

    import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String conten ...

  3. ios uiimagepickercontroller 选择相册或者拍照上传

    首先需要实现UIImagePickerControllerDelegate 代理 实现其imagePickerController 方法  这里用于选择图片或的拍照回调 //调用相机拍照 或者 图库选 ...

  4. ios 监控键盘状态

    增加键盘显示和隐藏事件监听 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(noti ...

  5. MySQL笔记(一)

    MySQL是目前最流行的关系型数据库管理系统之一,它是由MySQL AB公司开发.发布并支持.MySQL是一个跨平台的开源关系型数据库管理系统,被广泛地应用在internet上的中小型网站开发中.相比 ...

  6. Django框架(一):MVC设计模式、Django简介

    1. MVC设计模式 MVC设计模式:Model-View-Controller简写. 最早由TrygveReenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪8 ...

  7. adaptation|domestication|genome evolution|convergent evolution|whole-genome shotgun sequencing|IHGSC

    Dissecting evolution and disease using comparative vertebrate genomics-online 因为基因组不是独一无二的,同时人类基因组可以 ...

  8. 关于前端CSS的总结

    CSS语法 CSS语言的基本单位是样式声明:propertyName : value ; CSS语言的使用方式: 1.把CSS样式声明作为HTML标签的style属性值.2.使用CSS选择器 CSS常 ...

  9. 通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法

    WinForm 上放置的控件多了或者有大背景图,窗体加载时就会闪烁,对于一般的闪烁,设置 DoubleBuffer=True或许有一点改善,要立竿见影的解决可以重载 CreateParams 使用 W ...

  10. 903C. Boxes Packing#俄罗斯套娃问题(map使用)

    题目出处:http://codeforces.com/problemset/problem/903/C 题目大意:求这组数据中数据出现的最大重复次数 #include<iostream> ...