XMLHttpRequest javascript


高性能的Ajax应该考虑数据传输技术和数据格式,以及其他的如数据缓存等优化技术。

 

一、请求数据

请求数据的常用技术有XHR,动态脚本注入、Multipart XHR、iframes、Comet五种,其中前三种比较常见,后两种往往在比较极端的情况下使用。

 

1、XMLHttpRequest

这个是首选技术,有两种方式,post和get, 
GET:一般针对那些不会改变服务器状态,只获取数据的请求,GET请求的数据会被缓存起来,对于需要多次请求同一数据的情况,有助于提升性能。 
缺点:请求的url加上参数长度接近或超过2048字符时,会导致URL被截断(在IE中,IE限制url长度,IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。),这时需要使用post。 
POST:理论上POST没有限制,可用于较大量的数据传输。 
注:通过XHR请求数据时,无法访问外域数据

 

2、动态脚本注入

克服了XHR的限制:能够跨域请求数据 
通过创建script标签,将src指向不同域的url即可。 
与XHR相比: 
(1) 动态脚本注入无法设置头信息, 
(2) 只能使用get方式,不能使用post方式, 
(3) 不能访问请求的头信息,也不能将响应消息作为字符串来处理,响应消息一般是可执行的javascript脚本(其他待返回的XML、JSON或其他格式的数据都要封装在一个回调函数中)

 

3、Multipart XHR

MXHR允许客户端只用一个HTTP请求从服务器端向客户端传送多个资源。它通过在服务器端将多个资源(css文件、HTML片段、js代码、base64编码的图片)打包成一个由双方约定的特定字符分割的长字符串发送到客户端。然后,在客户端根据那个特定的字符将这个长字符串解析成各个资源。 
例如:

 
  1. $dataArr=array();
  2. $images=array('1.jpg','2.jpg','3.jpg');
  3. foreach($images as $img){
  4. $file=fopen($img,'r');
  5. $imgdata=fread($file,filesize($img));
  6. $imgdata=base64_encode($imgdata);
  7. fclose($file);
  8. array_push($dataArr,$imgdata);
  9. }
  10. $newchar=chr(1);
  11. echo implode($newchar,$dataArr);//使用一个不会出现在base64中的一个字符将各个图片的base64编码连成一个长字符串

数据到达客户端后,再进行解析

 
  1. function splitImage(imgstring){
  2. var imgdata=imgstring.split(\u0001'); //将字符串分割
  3. var img=document.createElement('img');
  4. for(var i=0,len=imgdata.length;i<len;i++){
  5. var tmpimg=img.cloneNode();
  6. tmpimg.src="data:image/jpeg;base64,"+imgdata[i];
  7. document.getElementById('div1').appendChild(tmpimg);
  8. }
  9. }

由于一次性请求的资源多,所以不必等待所有资源都返回在进行处理,可以根据readyState状态值监测响应状态,当readyState为3时,就对接收到的部分数据进行处理。 
优点:一次可以请求多个资源,提升性能 
缺点:获取的资源不能被浏览器缓存(以为资源是以字符串形式返回的) 
IE7以下版本不支持readyState为3的状态

 

二、发送数据

 

1、XHR

GET方式受浏览器的最大URL尺寸限制,当上传数据量较大时,用POST方式。 
对于少量数据,GET方式会更快,因为一个GET请求往服务器只发送一个数据包,而一个POST请求,至少要发送两个数据包,一个装载头信息,一个装载 
POST正文。

 

2、Beacons 信标

Beacons和动态脚本注入类似,先创建一个image对象,把src指向服务器上脚本的url,该url包含了通过get方式向服务器上传的键值对数据

 
  1. var params=["namme=lc","id=1"];
  2. var url="/test.php";
  3. var beacons=new Image();
  4. beacons.src=url+"?"+params.join("&");
  5. //注:并没有将它插入DOM中 所以图片是不显示的

服务器端接收到数据后,无需向客户端返回回馈信息。但是也可以在服务端做出不同的响应,比如返回1px宽的空白图片代表成功接收,2px宽的空白图片代表接收失败。

 
  1. beacons.onload=function (){
  2. if(this.width==1){
  3. //成功
  4. }else if(this.width==2){
  5. //失败
  6. }
  7. }

使用信标,是向服务器回传数据最快最有效的方式,服务器无需返回任何响应正文。 
缺点:无法使用POST方式,上传数据量有限制,服务器的响应类型很有限。 
所以,如果要往客户端返回大量数据,只能用XHR 
如果只关心发送数据到服务器(可能要返回少量信息),可以使用图片信标。

Beacons方法很巧妙,比如它可以利用image对象的src属性,浏览器创建一个新的image对象会去加载它的src属性值,如果把我们要传递给服务器的参数使用&连接起来组成GET方式的URL,然后赋给src,那么浏览器在发出请求的时候就可以把我们要传递的参数传递给服务端。我们可以在服务端做出不同的响应,比如返回1px宽的空白图片代表成功接收,2px宽的空白图片代表接收失败。这种传递数据的方法一般用于统计用户行为等非必须完成的请求。

补充: 
POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。参考:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

 

3、数据格式

服务器端与客户端进行数据传输时,数据的格式会影响其下载速度和解析速度,一般来说JSON形式和字符分隔的自定义格式是最好的。XML、HTML一般会增加数据量,解析较慢。 
大数据量且要求解析时间的话,可以选择: 
a、JSON-P数据,使用动态脚本获取,把数据当做js脚本运行而不是字符串,解析速度极快,能跨域使用,涉及敏感数据时不应使用 
b、自定义数据,用XHR或动态脚本注入获取,通过split解析,比JSON-P略快

 

4、数据缓存技术

一是,在服务器端,设置HTTP头信息,使用浏览器缓存 
一是,在客户端,把获取的信息存储到本地,避免再次请求 
设置HTTP头信息

 
  1. $lifetime=7*24*60*60;
  2. header('Expires'.gmdate('D,d M Y H:i:s',time()+$lifetime).'GMT');

客户端实现: 
把响应信息保存到一个本地对象中

高性能Ajax的更多相关文章

  1. 高性能JavaScript(高性能Ajax)

    ajax是一种与服务器通信而无需重载页面的方法(即局部刷新.) 高性能的Ajax应该考虑数据传输技术和数据格式,以及其他的如数据缓存等优化技术. 请求数据 请求数据的常用技术有XMLHttpReque ...

  2. 高性能 AJAX

    请求数据的常用的五种方式 1.XMLHttpRequest (XHR) var url = '/data.php'; var params = [     'id=934875',     'limi ...

  3. 【读书笔记】读《高性能JavaScript》

    这本<高性能JavaScript>讲述了有关JavaScript性能优化的方方面面,主要围绕以下几个方面: 1> 加载顺序 2> 数据访问(如怎样的数据类型访问最快,怎样的作用 ...

  4. input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has

    input屏蔽历史记录   设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处   ;(function($){$.ex ...

  5. 基于Yahoo网站性能优化的34条军规及自己的见解

    1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数,这是提高网页速 ...

  6. 【转】优化Web程序的最佳实践

    自动排版有点乱,看着蛋疼,建议下载中文PDF版阅读或阅读英文原文. Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了 一系列的实验.开发了各 ...

  7. Yahoo!网站性能最佳体验的34条黄金守则(转载)

    1.       尽量减少HTTP请求次数  终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...

  8. Yahoo!网站性能最佳体验的34条黄金守则

    Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践.他们为此进行了一系列的实验.开发了各种工具.写了大量的文章和博客并在各种会议上参与探讨.最佳实践的核心就是 ...

  9. yslow性能优化的35条黄金守则

    参考Best Practices for Speeding Up Your Web Site Exceptional Performance 团队总结了一系列优化网站性能的方法,分成了7个大类35条, ...

随机推荐

  1. 记录maven 整合SSM框架

    一.新建maven项目 建好的项目结构如下图: 还需要做以下配置: 勾选上这两项后,就会自动生成 "src/main/java"   和 "src/main/resour ...

  2. 《effective Go》读后记录

    一个在线的Go编译器 如果还没来得及安装Go环境,想体验一下Go语言,可以在Go在线编译器 上运行Go程序. 格式化 让所有人都遵循一样的编码风格是一种理想,现在Go语言通过gofmt程序,让机器来处 ...

  3. java关键字中文对比

    abstract 摘要|抽象assert 声称boolean 布尔break 中断byte 字节case 实例catch 捕捉char 烧焦class 类const 常量continue 持续defa ...

  4. ubuntu中安装ftp服务器

    1. 实验环境 ubuntu14.04 2.vsftpd介绍 vsftpd 是“very secure FTP daemon”的缩写,是一款在Linux发行版中最受推崇的FTP服务器程序,安全性是它的 ...

  5. mysql导出数据库和恢复数据库代码

    mysql导出数据库和备份数据库 用mysqldump 命令行 命令格式 mysqldump -u 用户名 -p  数据库名 > 数据库名.sql 范例: mysqldump -uroot -p ...

  6. iptables使用实践

    1.iptables 本质上是一组规则,报文从端口接收到之后,按照规则的顺序进行匹配,一旦匹配上则执行动作,后续就不再匹配. 2.为了体现出优先级,iptable分为4个表,5个链,如下: 优先级顺序 ...

  7. Echarts数据可视化polar极坐标系,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  8. 有人提了一个问题:一定要RESTful吗?

    写在前面的话 这个问题看起来就显得有些萌,或者说类似的问题都有些不靠谱,世上哪有那么多一定的事情,做开发都不一定做多久呢,所以说如果你有这个疑问的话是真真有点儿不着调,不过可能也就是随口一问吧,没有深 ...

  9. Java继承--子类的实例化过程

    一个对象的实例化过程: Person p = new Person(); 1,JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况 ...

  10. FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器

    0x00 前言 有时候即便是官方的文档手册也会让人产生误解,比如本文将要讨论的Unity引擎中的FixedUpdate方法. This function is called every fixed f ...