一、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那些事儿的更多相关文章

  1. 关于AJAX异步请求的那些事儿(2)

    1.使用AJAX发起GET请求消息 xhr.open("GET","XX.PHP?K1=V1$K2=V2",true); xhr.send(null); 2.使 ...

  2. IE浏览器下ajax和缓存的那些事儿

    项目经理最近返回了一些问题: (客户浏览器为IE11,本地360,谷歌没发现任何问题) 1.加载页面时下拉框中没有数据,关闭之后再打开出现数据: 2.数据保存之后页面没有刷新: 我也是接手别人的项目, ...

  3. 关于AJAX异步请求的那些事儿(1)

    1.什么事AJAX? Asynchronous Javascript And XML:异步的JS和XML,由Google2002年在GoogleSuggest应用提出,目标实现客户端和服务器“同时”运 ...

  4. 【转载】文件上传那些事儿,文件ajax无刷上传

    导语 正好新人导师让我看看能否把产品目前使用的FileUploader从老的组件库分离出来的,自己也查阅了相关的各种资料,对文件上传的这些事有了更进一步的了解.把这些知识点总结一下,供自己日后回顾,也 ...

  5. setTimeout那些事儿

    一.setTimeout那些事儿之单线程 一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序. 但是,不知道大家有疑问没——就是我们 ...

  6. 关于试用jquery的jsonp实现ajax跨域请求数据的问题

    我们在开发过程中遇到要获取另一个系统数据时,就造成跨域问题,这就是下文要说的解决办法: 先我们熟悉下json和jsonp的区别: 使用AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交 ...

  7. 关于JSON的那些事儿

    JSON的那些事儿 曾经有一段时间,XML是互联网上传输结构化数据的事实标准,其突出特点是服务器与服务器间的通信.但是业内不少人认为XML过于繁琐.冗长,后面为了解决这个问题也出现了一些方案,但是由于 ...

  8. 退役了退役了-AJAX

    hi 昨晚打球悲剧的把脚崴了. 要知道,上一次崴脚是四年前:那一次伤的是左脚,也是我这么多年打篮球的生涯中,这么多次崴脚中,最严重的一次受伤.休息了整整一个月,受寝室兄弟们的无微不至的照顾,最后也买了 ...

  9. jsonp与ajax

    jsonp思维导图:1.定义2.为什么用3.json原理4.优缺点何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? JSON和JSONP??虽然只有一个字母的差别,但 ...

随机推荐

  1. Linux文件系统1---概述

      1.引言 本文所述关于文件管理的系列文章主要是对陈莉君老师所讲述的文件系统管理知识讲座的整理.Linux可以支持不同的文件系统,它源于unix文件系统,也是unix文件系统的一大特色. 本文主要先 ...

  2. UML和模式应用1: 面向对象的分析与设计

    1.基本术语说明 items note OOA/D  面向对象的分析与设计 UML 描述.构造和文档化系统制品的可视化语言 模式 问题解决方案的公式 2. 本书的主要内容 本书的主旨是对应用了UML和 ...

  3. 一步步实现windows版ijkplayer系列文章之七——终结篇(附源码)

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  4. React-Native 之 项目实战(一)

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...

  5. windows系统实现mysql数据库数据库主从复制

    环境: master mysql服务器 192.168.8.201 slave mysql服务器 192.168.8.89 目标: 实现主从复制 1.将MySQL5.5安装文件分别拷贝到两台机器的c盘 ...

  6. 使用Navicat Premium对sqlserver 2008进行表、字段及用户权限的精细化管理

    在一些特殊的业务场景,我们需要对数据库进行精细化的管理,比如只能授权给某用户某个表的操作权限,最小权限法则可以保障数据库最大的安全.利用navicat这个轻量化的工具可以很轻松的解决这个问题 1.通过 ...

  7. Eureka 开发时快速剔除失效服务

    Spring Cloud 版本: Dalston.SR5 服务端配置: # 关闭保护机制 eureka.server.enable-self-preservation=false #剔除失效服务间隔 ...

  8. Lodash JavaScript 实用工具库

    地址:https://www.lodashjs.com/ Lodash 是一个一致性.模块化.高性能的 JavaScript 实用工具库.

  9. Vue源码

    参考文章:http://hcysun.me/2017/03/03/Vue%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/?utm_source=qq&utm_medi ...

  10. OneNET麒麟座应用开发之七:控制采样电机

    气体采样采用主动抽取气体的方式保证充足而平稳的气流,所以我们采用气泵抽取气体来完成. 1.设计概述 客户对这部分要求能够设定电机的速度,但并不需要动态调节.对电机的控制有很多方式,我们采用比较简单的方 ...