高性能javascript学习笔记系列(6) -ajax
参考 高性能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的更多相关文章
- 高性能javascript学习笔记系列(2)-数据存取
参考 高性能javascript Tom大叔深入理解javascript系列 相关概念 1.执行上下文 当控制器转到ecmascript可执行代码的时候,就会进入一个执行上下文,执行上下文是以堆栈 ...
- 高性能javascript学习笔记系列(1) -js的加载和执行
这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...
- 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践
参考高性能javascript 理解浏览器UI线程 用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程 UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...
- 高性能javascript学习笔记系列(4) -算法和流程控制
参考高性能javascript for in 循环 使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...
- 高性能javascript学习笔记系列(3) -DOM编程
参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...
- JavaScript学习笔记系列2:Dom操作(一)
一.什么是Dom? DOM------>Document Object Model 直接翻译就是文档对象模型. DOM------>定义了表示和修改文档所需的对象.这些对象的行为和属性以及 ...
- 高性能javascript 学习笔记(1)
加载和运行 管理浏览器中的javascript代码是个棘手的问题,因为代码运行阻塞了其他浏览器处理过程,诸如用户绘制,每次遇到<script>标签,页面必须停下来等待代码下载(如果是外部的 ...
- JavaScript学习笔记系列1:JavaScript的是什么?
一.JS是什么? JavaScript作为Netscape Navigator浏览器的一部分首次出现在1996年.它最初的设计目标是改善网页的用户体验. 作者:Brendan Eich 期初JavaS ...
- Dynamic CRM 2013学习笔记 系列汇总
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
随机推荐
- Nginx服务器之基础学习
一.Nginx介绍 nginx:Nginx是一种软件服务器(轻量级),故它最主要的功能就是可以与服务器硬件结合,我们的应用程序可以放在nginx服务器上进行发布,已达到让网民浏览的效果.除此自外,Ng ...
- Spring<bean>标签是反射来实现的
- CSS系列:CSS3新增选择器
1. CSS1定义的选择器 选择器 类型 说明 E 类型选择器 选择指定类型的元素 E#id ID选择器 选择匹配E的元素,且匹配元素的id为“id”,E选择符可以省略. E.class 类选择器 选 ...
- pipedata3d User Guide
pipedata3d User Guide 1. Introduction 在管道设计过程中,会使用到大量的标准,如ASME,DIN,GB,CB,HG,SH等等.管道设计人员在设计过程中,需要翻阅相关 ...
- 纯CSS照片墙
css中transform参考CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate 效果图:
- JavaScript跨域调用、JSONP、CORS与ASP.NET Web API[共8篇]
[第1篇] 同源策略与JSONP 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境.而这里所说的应用,基本是指在浏览器中执行的客户端JavaScript ...
- Web APi之认证(Authentication)两种实现方式后续【三】(十五)
前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...
- No row with the given identifier exists:
最近在弄一个后台项目,有用到hibernate操作数据库.写hql语句表一对一关联查询的时候报这个错误.受到了csdn上一篇博客的启发,解决了我的问题.他的博客地址:http://blog.csdn. ...
- mouseenter以及mouseleave兼容性
在IE的全系列中都实现了mouseenter和mouseleave事件,但是在早期的w3c浏览器中却没有实现这两个事件.有时候,我们需要使用 mouseenter事件来防止子元素的冒泡,这就涉及到事件 ...
- linux源码分析(一)
前置:这里使用的linux版本是4.8,x86体系. 其实linux的内核启动的入口文件还是非常好找的,init/main.c. static 和 extern 首先理解的是static和extern ...