ajax那些事儿
一、Ajax的定义
浏览器与服务器之间,采用HTTP协议通信。用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出HTTP请求。
Ajax全称Asynchronous JavaScript and XML,即异步的JavaScript和XML。
Ajax可以是同步请求,也可以是异步请求。但是,大多数情况下,特指异步请求。因为同步的Ajax请求,对浏览器有“堵塞效应”。
二、Ajax的请求过程
1、创建XMLHttpRequest对象;
2、浏览器与服务器建立连接open;
3、设置超时,回调函数;
4、浏览器向服务器发送请求send;
5、服务器向浏览器响应请求,客户端获取异步调用返回的数据;
6、实现局部刷新。
三、实现简单的get请求和post请求
/**
* [getXHR 返回XMLHttpRequest对象实例]
* 公用方法,get请求和post请求都可以用
*/
function getXHR() {
var xhr = null;
if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
return xhr;
} //实现一个get请求
function getRequest(url){
var xhr = getXHR();
xhr.open("GET",url);
xhr.onreadystatechange = function() {
if ((xhr.readyState == 4) && (xhr.status == 200)) {
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
}
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.send(null);
} //实现一个post请求
function postRequest(url,data){
var xhr = getXHR();
xhr.open("POST",url);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); xhr.onreadystatechange = function() {
if ((xhr.readyState == 4) && (xhr.status == 200)) {
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
}
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.send(data);
}
get,从服务器取数据,将表单中的数据按照Variable=Value名值对的形式,添加到Action所指向的Url后面,并且两者使用“?”连接,而各个变量之间使用”&”连接。该方法不安全,传输的数据量小,Url长度有限制,它要求Form表单的数据集的值必须为ASCII字符,get是Form的默认方法。
post,给服务器交数据,将表单中的数据放在Form的数据体中,按照变量和值相对应的方式,传递到Action所指向的URL。该方法比较安全,可以传输大量的数据,它支持整个ISO10646字符集。上传文件时,只能使用post。
四、Ajax异步的原理
1、浏览器有4种线程
GUI渲染线程
Javascript引擎线程
浏览器事件触发线程
HTTP请求线程
2、线程间的协作
对于一个Ajax请求,Javascript引擎首先生成XMLHttpRequest实例对象,open过后再调用send方法。至此,所有的语句都是同步执行,但从send方法内部开始,浏览器为将要发生的网络请求创建了新的HTTP请求线程,这个线程独立于Javascript引擎线程,于是网络请求异步被发送出去了。另一方面,Javascript引擎并不会等待Ajax发起的HTTP请求收到结果,而是直接顺序往下执行。
当HTTP请求收到response后,浏览器事件触发线程捕获到了Ajax的回调事件,该回调事件并不会立即被执行,而是以先进先出的方式添加到任务队列的末尾,等到Javascript引擎空闲时,任务队列中排队的任务将会依次被执行,循环读取事件。这些事件回调包括setTimeout,setInterval,click,ajax异步请求。
在回调事件内部,有可能对dom进行操作。此时浏览器便会挂起Javascript引擎线程,转而执行GUI渲染线程,进行UI重绘(repaint)或者回流(reflow)。当Javascript引擎重新执行时,GUI渲染线程又会被挂起,GUI更新将被保存起来,等到Javascript引擎空闲时立即被执行。
GUI渲染线程和Javascript引擎线程是互斥的。其他线程相互之间,都是可以并行执行的,Ajax并没有破坏Javascript的单线程机制。
五、Ajax的优缺点
1、优点
A、无刷新更新数据
Ajax最大优点就是能在不刷新整个页面的前提下与服务器通信维护数据,这使得Web应用程序更为迅捷地响应用户交互,并避免了在网络上发送那些没有改变的信息,减少用户等待时间,带来非常好的用户体验。
B、异步与服务器通信
Ajax使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。优化了Browser和Server之间的沟通,减少不必要的数据传输、时间及降低网络上数据流量。
C、前端和后端负载平衡
Ajax可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,Ajax的原则是“按需取数据”,可以最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。
D、基于标准被广泛支持
Ajax基于标准化的并被广泛支持的技术,不需要下载浏览器插件或者小程序,但需要客户允许JavaScript在浏览器上执行。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。
E、界面与应用分离
Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。
2、缺点
A、Ajax干掉了Back和加入收藏书签功能,即对浏览器机制的破坏。
对应用Ajax最主要的批评就是,它可能破坏浏览器的后退与加入收藏书签功能。在动态更新页面的情况下,用户无法回到前一个页面状态,这是因为浏览器仅能记下历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的可能差别非常微妙;用户通常都希望单击后退按钮,就能够取消他们的前一次操作,但是在Ajax应用程序中,却无法这样做。不过开发者已想出了种种办法来解决这个问题,比如创建或使用一个隐藏的IFRAME来重现页面上的变更。当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态。
比如使用URL片断标识符(通常被称为锚点,即URL中#后面的部分)来保持追踪,允许用户回到指定的某个应用程序状态。许多浏览器允许JavaScript动态更新锚点,这使得Ajax应用程序能够在更新显示内容的同时更新锚点。
比如HTML5的pajax技术,ajax+history.pushState以后可以直接操作浏览历史,并以字符串形式存储网页状态,将网页加入网页收藏夹或书签时状态会被隐形地保留。
B、Ajax的安全问题
Ajax技术带来很好的用户体验的同时也对IT企业带来了新的安全威胁,Ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。Ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有Ajax也难以避免一些已知的安全弱点,诸如跨站点脚本攻击、SQL注入攻击和基于Credentials的安全漏洞等等。
C、因为网络延迟需要给用户提供必要提示
进行Ajax开发时,网络延迟,会让用户感到厌烦。通常的解决方案是,使用一个可视化的组件来告诉用户系统正在进行后台操作并且正在读取数据和内容。
六、优化get和post方法
直击链接:https://github.com/camille666/mytools/blob/master/pc/es5/base.js
七、ajax和jsonp的区别
相同点:都是请求一个url;
不同点:ajax的核心是通过xmlHttpRequest获取内容,jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。
ajax那些事儿的更多相关文章
- 关于AJAX异步请求的那些事儿(2)
1.使用AJAX发起GET请求消息 xhr.open("GET","XX.PHP?K1=V1$K2=V2",true); xhr.send(null); 2.使 ...
- IE浏览器下ajax和缓存的那些事儿
项目经理最近返回了一些问题: (客户浏览器为IE11,本地360,谷歌没发现任何问题) 1.加载页面时下拉框中没有数据,关闭之后再打开出现数据: 2.数据保存之后页面没有刷新: 我也是接手别人的项目, ...
- 关于AJAX异步请求的那些事儿(1)
1.什么事AJAX? Asynchronous Javascript And XML:异步的JS和XML,由Google2002年在GoogleSuggest应用提出,目标实现客户端和服务器“同时”运 ...
- 【转载】文件上传那些事儿,文件ajax无刷上传
导语 正好新人导师让我看看能否把产品目前使用的FileUploader从老的组件库分离出来的,自己也查阅了相关的各种资料,对文件上传的这些事有了更进一步的了解.把这些知识点总结一下,供自己日后回顾,也 ...
- setTimeout那些事儿
一.setTimeout那些事儿之单线程 一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序. 但是,不知道大家有疑问没——就是我们 ...
- 关于试用jquery的jsonp实现ajax跨域请求数据的问题
我们在开发过程中遇到要获取另一个系统数据时,就造成跨域问题,这就是下文要说的解决办法: 先我们熟悉下json和jsonp的区别: 使用AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交 ...
- 关于JSON的那些事儿
JSON的那些事儿 曾经有一段时间,XML是互联网上传输结构化数据的事实标准,其突出特点是服务器与服务器间的通信.但是业内不少人认为XML过于繁琐.冗长,后面为了解决这个问题也出现了一些方案,但是由于 ...
- 退役了退役了-AJAX
hi 昨晚打球悲剧的把脚崴了. 要知道,上一次崴脚是四年前:那一次伤的是左脚,也是我这么多年打篮球的生涯中,这么多次崴脚中,最严重的一次受伤.休息了整整一个月,受寝室兄弟们的无微不至的照顾,最后也买了 ...
- jsonp与ajax
jsonp思维导图:1.定义2.为什么用3.json原理4.优缺点何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? JSON和JSONP??虽然只有一个字母的差别,但 ...
随机推荐
- stderr 和stdout
今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...
- SpringBoot使用thymeleaf模板引擎
(1).添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- freeRTOS中文实用教程3--中断管理之延迟中断处理
1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只 ...
- linux软链接和硬链接的区别
硬链接:ln 3.txt 4 相当于把源文件复制了一份 软连接:ln -s 3.txt 5 相当于快捷方式 改动源文件4.5同时更新,删除3.txt ,5不存在,4存在的.
- 企业环境下的OpenStack自动化功能测试(转载)
原文地址:http://mp.weixin.qq.com/s?__biz=MzAxOTAzMDEwMA==&mid=2652502581&idx=1&sn=0c26519bcb ...
- 记录entityframework生成的sql语句
Interceptors (EF6.1 Onwards) Starting with EF6.1 you can register interceptors in the config file. I ...
- CentOS 6.5下的lamp环境rsyslog+MySQL+loganalyzer实现日志集中分析管理
前言 rsyslog系统日志,在CentOS5上叫syslog,而在CentOS6上叫rsyslog,是增强版的syslog,CentOS5上的配置文件在/etc/syslog.conf下,而Cent ...
- Ex 5_28 Alice想要举办一个舞会..._第十次作业
根据总人数建立顶点数量为总人数的无向图,顶点之间有边相连表示两个人相互认识,没有边则表示不认识.对于每一个顶点v,设d(v)表示顶点的度,若d(v)<5,即v认识的人数少于5,则不邀请v,若d( ...
- .net下web页生产一维条形码
code-39 前台 aspx <asp:Image ID="imgBandCode" runat="server" ImageUrl="~/W ...
- PHP接口继承及接口多继承原理与实现方法详解
在PHP的接口中,接口可以继承接口.虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口.当然接口的继承也是使用extends关键字,要多个继承的话只 ...