参考 高性能javascript

javascript高级程序设计

ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读取数据

var xhr = new XMLHttpRequest(); //只支持IE7以及更高的版本
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 ) {
//成功
} else {
//失败
}
}
};
xhr.open("get","test.html",false); //第三个参数代表发送同步请求还是异步请求 false代表同步 true代表异步 open方法选择请求的类型 请求的URL 是否发送异步请求
xhr.send(null);

上面是一个简单的创建XHR对象 并且发送get请求的例子

readyState属性  表示请求/响应过程的当前活动阶段

  • 0:初始化阶段 尚未调用open方法
  • 1:启动  已经调用open()方法 尚未调用send方法
  • 2:发送  已经调用send方法,但是未收到响应
  • 3:接收 已经接收到部分的响应数据
  • 4: 完成  已经接收到全部的响应数据,而且可以在客户端使用

在接收到响应后,响应的数据会自动的填充XHR对象的属性

responseText 作为响应主体被返回的文本

status 响应的HTTP状态

statusText HTTP状态的说明

请求数据

  (1)XHR   缺点XHR无法从外域请求数据  get请求的数据数据会被浏览器缓存起来

(2)动态脚本注入(jsonp)  在页面中创建一个脚本标签并且设置它的src属性 然后将它添加到页面中  它可以从外域请求数据,但是动态脚本控制提供的控制是有限的,不能设置头信息,参数传递的方式也只能GET方式,不能设置请求的超时处理或者重试 响应的消息必须是可执行的js代码 也就是你想请求的任何格式的数据都必须要封装在一个回调函数中

(3) Multipart XHR (MXHR) 允许客户端只用一个HTTP请求就可以从服务端向客户端传送多个资源,通过在服务端将资源打包成双方约定的字符串分割的长字符串发送给客户端,然后在客户端去处理这个长字符串,根据提供它的mime-type类型和其他信息解析出每个资源  但是通过这种方式获取的数据无法被浏览器缓存,但是这种方式能很好的减少http请求

发送数据

  (1)XHR  可以选择post 和 get两种方式向服务端发送数据  get请求是将请求信息包含在url中  post请求将请求信息包含在请求体中,下面是一个简单的发送post请求的函数

function xhrPost(url,params,callback) {
var req = new XMLHttpRequest(); req.onerror = function(){
setTimeout(function(){
xhrPost(url,params,callback);
},1000);
} //请求失败 req.onreadystatechange = function() {
if(req.readyState == 4) {
if(callback && typeof callback === 'function') {
callback();
}
}
}
req.post("POST",url,true);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//数据返回服务器的编码类型时url编码 服务器端知道如何解析数据
req.setRequestHeader("Content-Length",params.length);
req.send(params.join('&'));
}

(2)Beacons   通过js创建一个新的Image对象,并把src属性设置为服务器上的脚本url(url中包含着需要向服务器端传送的数据)    但是这种方式只能发送get请求,并且在服务端接收到数据想要获取响应信息的方式也有限

提高ajax性能

缓存数据

(1)客户端发送响应的请求头确保响应会被浏览器缓存起来

在请求头中设置expires字段  规定在特定的时间之前 访问该url使用缓存

(2)在客户端将获取的信息缓存到本地,从而避免再次的发起请求

通过将url和请求的数据做成键值对的方式存储在本地

var localCache = {}

function xhrRequest(url,callback) {
if(localCache[url]) {
callback.success(localCache[url]);
return;
} var req = new XMLHttpRequest();
req.onerror = function() {
callback.error();
} req.onreadystatechange = function() {
if(req.readyState == 4 ) {
if(req.responseText == "" || req.status == '404') {
callback.error();
return;
}
localCache[url] = req.responseText;
callback.success(req.responseText);
}
}
req.open("GET",url,true);
req.send(null);
}

高性能javascript学习笔记系列(6) -ajax的更多相关文章

  1. 高性能javascript学习笔记系列(2)-数据存取

    参考 高性能javascript Tom大叔深入理解javascript系列 相关概念 1.执行上下文   当控制器转到ecmascript可执行代码的时候,就会进入一个执行上下文,执行上下文是以堆栈 ...

  2. 高性能javascript学习笔记系列(1) -js的加载和执行

    这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...

  3. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  4. 高性能javascript学习笔记系列(4) -算法和流程控制

    参考高性能javascript for in 循环  使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...

  5. 高性能javascript学习笔记系列(3) -DOM编程

    参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...

  6. JavaScript学习笔记系列2:Dom操作(一)

    一.什么是Dom? DOM------>Document Object Model 直接翻译就是文档对象模型. DOM------>定义了表示和修改文档所需的对象.这些对象的行为和属性以及 ...

  7. 高性能javascript 学习笔记(1)

    加载和运行 管理浏览器中的javascript代码是个棘手的问题,因为代码运行阻塞了其他浏览器处理过程,诸如用户绘制,每次遇到<script>标签,页面必须停下来等待代码下载(如果是外部的 ...

  8. JavaScript学习笔记系列1:JavaScript的是什么?

    一.JS是什么? JavaScript作为Netscape Navigator浏览器的一部分首次出现在1996年.它最初的设计目标是改善网页的用户体验. 作者:Brendan Eich 期初JavaS ...

  9. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

随机推荐

  1. Adobe Photoshop CC 打开时报错~配置错误:请卸载并重新安装该产品

    后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 个人估计,要么安 ...

  2. Windows下搭建MySQL Master Slave

    一.背景 服务器上放了很多MySQL数据库,为了安全,现在需要做Master/Slave方案,因为操作系统是Window的,所以没有办法使用keepalived这个HA工具,但是我们可以接受人工进行切 ...

  3. 解读sencha touch移动框架的核心架构(一)

    sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架 那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构 ...

  4. php的mysql\mysqli\PDO(三)PDO

    原文链接:http://www.orlion.ga/1153/ PDO是一种数据库抽象层,不止可以访问mysql还可以访问其他数据库. 一.__construct() PDO::__construct ...

  5. MySql联接算法

    联接算法是MySql数据库用于处理联接的物理策略.在MySql 5.5版本仅支持Nested-Loops Join算法,如果联接表上有索引时,Nested-Loops Join是非常高效的算法.如果有 ...

  6. lintcode 最长上升连续子序列 II(二维最长上升连续序列)

    题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 I ...

  7. (转)对Lucene PhraseQuery的slop的理解

    所谓PhraseQuery,就是通过短语来检索,比如我想查"big car"这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语 ...

  8. canvas学习笔记

    html5的新标签:canvas; 作用:标签定义图形,比如图表和其他图像:标签只是图形容器,您必须使用脚本来绘制图形.默认大小:宽300px,高150px; 背景知识:概念最初由苹果公司提出的,用于 ...

  9. C# 保护Excel文档

    C# 保护Excel文档 说到保护excel文档,我们首先想到的是密码保护的方式,但excel与word有点不一样,一般情况下,每个excel工作薄都或多或少地含有一定数量的工作表,因此保护excel ...

  10. hdu FatMouse's Speed 动态规划DP

    动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid ...