什么是Ajax?为什么要使用它?

Ajax全称 Asynchronous(异步) JavaScript and XML,终结了“单击,等待”的交互模式,它是指一种创建交互式网页应用的网页开发技术,Ajax并不是一种技术,它是一系列规范的集合,包含:

  • 基于web标准(standards-basedpresentation)XHTML+CSS的表示;

  • 使用 DOM(Document ObjectModel)进行动态显示及交互;

  • 使用 XML 和 XSLT 进行数据交换及相关操作;

  • 使用 XMLHttpRequest 进行异步数据查询、检索;

  • 使用 JavaScript 将所有的东西绑定在一起。

Ajax应用程序的优势在于:

  1. 通过异步模式,提升了用户体验

  2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用

  3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

基础-HTTP协议

在使用Ajax之前,必须先了解客户端和服务器间通信的基础是怎样的,在这里,他们使用的规则是HTTP协议,两者之间通过一定格式的报文(请求报文和响应报文)进行交流,详细的看这篇文章。链接:http://www.jianshu.com/p/8163...

核心-XMLHttpRequest对象

支撑起Ajax大桥的便是XHR这个对象了,它是一种支持异步请求的技术。简而言之,XmlHttpRequest可以让JavaScript向服务器提出请求并处理响应,而不阻塞用户。通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。
在使用它之前,我们先来了解一下XHR对象,简单起见。关于不同浏览器之间的XHR对象暂时不叙述,直接使用原生XHR对象,在浏览器里面创建一个新的XHR对象var xhr = new XMLHttpRequest();,在调试窗口里面输出它可以看到:


它是一个对象,拥有一些属性,常见的如下:

  • readyState:该属性表示请求/响应过程的当前活动阶段,可用取值如下:

0:请求未初始化(还没有调用open())。
1:请求已经建立,但是还没有发送(还没有调用send())。
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4:响应已完成;已经接收到全部响应数据,而且已经可以在客户端使用了。

只要readyState属性的值发生变化,便可以触发readystatechange事件,下面来体验一下。

//演示readystatechange事件
var log = function(tmp){
    console.log(tmp);
};
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    log(xhr.readyState);
};
xhr.open("get","./content.txt",true);
xhr.send(null);

观察运行结果,可以很明确地看到状态的发生改变。

  • responseText:作为响应主体被返回的文本,无论内容类型是什么,响应主体的内容都会保存在这里。

  • responseXML:如果响应的内容类型是text/xmlapplication/xml,这个属性中将保存着响应数据的XML DOM文档。

  • status:响应的HTTP状态,就是HTTP的状态代码,200,304(表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本)这些,确保接收到适当的响应

  • statusText:HTTP状态的说明

基础用法

var xhr = new XMLHttpRequest();
//创建一个XHR对象
xhr.open("get","test.txt",true);
//启动一个请求以备发送,这个时候xhr的readyState为1
xhr.send(null);
//正式发送请求,readyState为2,随后请求成功,readyState为4

我们来详细说一下细节。

  • 首先是open方法:
    第一个参数是HTTP的请求方式,常用的比如getpost,第二个参数是请求的url,如果是get方式的话那么一般请求的参数就附加在这里。第三个参数是控制同步或者异步,true表示异步,false表示同步。简单来说,如果使用同步的话,那么会阻塞后面的代码,必须等到本次请求完毕才可以,异步则是另开一个线程去执行ajax,下面代码继续进行。

  • 再说send方法:
    send方法有一个参数,这个参数将被写入到请求报文里面传递,上面说到了get方式的参数是直接写到url里面的,所以对于这种方法,send的参数应该为null,而对于post方式,url和请求参数是分离的,所以需要写入到send方法里。

HTTP头部信息

我们可以使用已有的API来对上面创建的请求报文进行增添或对响应报文进行处理,比如设置Cookie。

xhr.setRequestHeader("imake","myValue");//添加头部信息
xhr.getResponseHeader(headerName);//获取头部信息
xhr.getAllResponseHeaders();//获取全部头部信息

GET请求

GET方法将需要查询的字符串追加到URL的末尾,也就是在XHR的open方法的URL末尾进行添加,需要进行encodeURIComponent()处理,对此封装函数如下:

function addURLParam(url,name,value){
    url+=(url.indexOf("?") == -1 ? "?" : "&");
    url+=encodeURIComponent(name)+"="+encodeURIComponent(value);
}
xhr.open("get",url,true);

POST请求

讨论POST之前,我们先回想一下,POST主要用在表单提交,表单提交的写法很多,比如:

<button>提交</button>
<input type="submit" value="提交">
<div id="submit">我用来提交表单</div>
var sub = document.getElementById("submit");
sub.addEventListener("click",function(){
    document.getElementById("test").submit();
});

前两种方式在使用的时候非常不便,比如我们再检测它们点击之前需要进行表单验证,那么因为它们自身具有默认的提交功能,所以我们得把它们的默认功能阻止一下,所以使用第三种比较舒服。
在表单进行post时,背地里它将请求的Content-Type设置为了application/x-www-form-urlencoded(这种类型是上传不了文件的,先挖个坑),并且把表单序列化了。我们来演示一下:


明白了传统的post表单提交之后,我们来说说Ajax,其实它也是模仿表单提交,所以要主动地告诉服务器,我是post方式,比较复杂,你做好准备,所以要设置Content-Type头部信息为application/x-www-form-urlencoded,其次是对表单进行序列化,我们可以使用jQuery里面的serialize()方法,测试如下:

爱不释手的Ajax的更多相关文章

  1. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  2. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  3. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  4. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  5. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. ajax从JSP传递对象数组到后台的方法

    今天小编就为大家分享一篇ajax从JSP传递对象数组到后台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  7. 解决ajax返回验证的时候总是弹出error错误的方法

    这篇文章主要介绍了解决ajax返回验证的时候总是弹出error错误的方法,感兴趣的小伙伴们可以参考一下

  8. 使用AJAX完成用户名是否存在异步校验

    这篇文章主要介绍了使用AJAX完成用户名是否存在异步校验的相关资料,需要的朋友可以参考下

  9. ajax实现无刷新省市县三级联动

    这篇文章主要为大家详细介绍了ajax实现无刷新省市县三级联动的相关资料,利用三层架构实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. jQuery Ajax 实现分页 kkpager插件实例代码

    本文通过实例代码给大家讲解了jQuery Ajax 实现分页 kkpager插件功能,需要的的朋友参考下吧

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部