参考 高性能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. html 生成pdf

    HTML生成PDF(c#) 最近因为工作需要,小小的研究了一下HTML生成PDF的方法,这方面的内容很多,但要么是不尽如人意的方法,要么就是那种收费的类库!为了广大.neter的福利,把自己的一点小小 ...

  2. 浅谈cssText

    给一个HTML元素设置css属性,如 var head= document.getElementById("head"); head.style.width = "200 ...

  3. HTML5系列:HTML5绘图

    1. canvas元素基础 canvas元素是HTML5中新增的一个重要元素,专门用来绘制图形. 在页面中使用canvas元素绘制图形需要经过的三个步骤: 步骤一  使用canvas元素创建一个画布区 ...

  4. 轻量级前端MVVM框架avalon - 执行流程2

    接上一章 执行流程1 在这一大堆扫描绑定方法中应该会哪些实现? 首先我们看avalon能帮你做什么? 数据填充,比如表单的一些初始值,切换卡的各个面板的内容({{xxx}},{{xxx|html}}, ...

  5. 在ASP.NET MVC的Action中直接接受客户端发送过来的HTML内容片段

    出于安全的考虑,默认情况下,如果从客户端发送过来的数据中直接包括了HTML内容,ASP.NET会自动启动保护措施,你会收到下面的错误提示 这当然是一个不错的设计,只不过在某些特殊的事情,如果我们确实需 ...

  6. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  7. RESTful API URI 设计: 查询(Query)和标识(Identify)

    相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iPhone 6 的产品. 是不是感觉很简单呢?根 ...

  8. geotrellis使用(十)缓冲区分析以及多种类型要素栅格化

    目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一.前言        上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,本文主要介绍栅格化过程中常用到的缓冲区分 ...

  9. MVC html.actionlink

    Html.ActionLink 在 LinkExtensions 类中,ActionLink方法参数说明: 简单来说捏 就是这样滴 参数                      类型         ...

  10. MySQL入门03-MySQL配置安全性、易用性

    一.设定管理员用户和密码 二.处理test库权限隐患 三.自定义脚本提升易用性 中间定义文件 启动MySQL服务 关闭MySQL服务 快捷登录MySQL 四.设置开机自动启动MySQL服务 Refer ...