再深入一点ajax
1.建立兼容性强的XHR对象有那么复杂么?
看过一些书,书上为了写针对低版本IE和其他非IE浏览器需要写一大串兼容函数,典型的就是JS高级程序上的。
可是在现实开发中,为了兼容IE6/IE7,只需要这样创建一个XHR对象: var XHR=new ActiveXObject('Microsoft.XMLHTTP');就足够了。
而IE8以上是支持XMLHttpRequest对象的。
2.ajax修改HTTP请求头和获取HTTP响应头
无论是ActiveX对象还是XMLHttpRequest对象,都会支持以下几种方法:
xhr.setRequestHeader('key','value');
xhr.getResponseHeader('key');
xhr.getAllResponseHeaders();
区分一下:在xhr对象的方法中,我们只能设置http请求头,而不能获取http请求头。相反:我们只能获取响应头,而不能设置响应头。(原因嘛,稍微有点BS常识的人都知道)
不过这三种方法中常用的只有setRequestHeader方法,可以用来设置请求报头,典型的就是GET请求缓存和post方式模拟提交表单数据的请求,必须需要设置http响应头的Control-Type属性值为:application/x-www-form-urlencoded,而设置头的顺序也是有讲究的,1.先open 2.设置头 3.再send(data); 否则会报 ‘未指明错误’ 的异常
剩下的两种,除非你要做响应进度条,否则没啥用(至少初级水平的前端开发人员在大多数情况下是用不到的)。利用的是响应头中的Content-length
3.ajax的CORS策略
所谓的CORS其实就叫跨域资源共享,说白了就是Ajax跨域。
ajax跨域不是剃头挑子一头热就能解决的,肯定需要目标资源那边的服务器支持,否则无法达成跨域
设置响应报头方法
js高级程序设计上说的很清楚,我只是简单的提一下:
不同域服务器要做的事:给HTTP的响应报头添加如下属性: Access-Control-Allow-Origin:ajax请求域域名
发起ajax请求域要做的事:XMLHttpRequest已经支持了对不同域资源的解析,所以这边我们不需要做什么改动。至于ActiveObject,由于我在用两个同域名不同端口的VS2010项目做的实验,即使不设置响应头也能“跨域”,所以现在不确定。
综合上述提到得内容,我们可以编写一个通用的ajax方法:
function ajax(url, method, funcSucc, funcFail, data, contentType) {
var xhr = null;
if (window.ActiveXObject) {
xhr = new ActiveXObject('Microsoft.XMLHttp');
}
else {
xhr = new XMLHttpRequest();
}
if (data) {
if (method == 'post' || method == 'POST') {
xhr.open(method, url, true);
try{
xhr.setRequestHeader('Content-Type', contentType);
}
catch (e) {
alert(e);
}
}
else {
var arr = url.split('?');
if (arr[1]) {
url = arr[0] + '?' + arr[1] + '&' + +data;
}
else {
url += '?' + data;
}
xhr.open(method, url, true);
}
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == '200') {
if (funcSucc) {
funcSucc(xhr.responseText);
}
else {
return xhr.responseText;
}
}
else {
if (funcFail) {
funcFail();
}
else {
alert('错误状态:' + xhr.status);
}
}
}
}
if (method == 'post' || method == 'POST') {
xhr.send(data);
}
else {
xhr.send(null);
}
}
4.如何提升ajax的性能
a.设法缓存请求到得responseText
方法有两种:1是设置请求报头,添加 Expires字段的过期时间,时间格式是格林尼治时间。而且只适用于get方法的请求;
2是设置本地缓存,用全局对象存储responseText,这种方法比较简单,而且适用于移动端。
b.将数段内容的responseText分段处理
通过判断xhr对象的readyState==3时的状态,可以一段一段的获取responseText,这样可以避免处理长的回文。
req.onreadystatechange = function() {
if (req.readyState === 3) { // 只有当二次请求之后的所有请求的状态为3时,才能获取上次请求发回的responseText,这里是对上次的处理.
var dataSoFar = req.responseText;
...
}
else if (req.readyState === 4) { // 又一段请求回文被获取
var data = req.responseText;
...
}
}
c.回文类型的选择
建议选用jsonp方式处理请求,或者自定义回文结构类型。jsonp的方式使得回文内容被当做JavaScript对象处理,省去了对象转换的繁琐。而自定义回文结构,则可以用更好的解析方法解析responseText;
再深入一点ajax的更多相关文章
- Android图表库MPAndroidChart(七)—饼状图可以再简单一点
Android图表库MPAndroidChart(七)-饼状图可以再简单一点 接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果 这个效果,我们实现,和之前一样的套路,我先来说下 ...
- 前端通信:ajax设计方案(八)--- 设计请求池,复用请求,让前端通信快、更快、再快一点
直接进入主题,本篇文章有点长,包括从设计阶段,到摸索阶段,再到实现阶段,最后全面覆盖测试阶段(包括数据搜集清洗),还有与主流前端通信框架进行对比PK阶段. 首先介绍一下一些概念: 1. 浏览器的并发能 ...
- 再谈Jquery Ajax方法传递到action 【转载】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cnn237111.blog.51cto.com/2359144/984466 之 ...
- 再谈Jquery Ajax方法传递到action
原始出处 :http://cnn237111.blog.51cto.com/2359144/984466 本人只是转载 原文如下: 假设 controller中的方法是如下: public Act ...
- 再谈Jquery Ajax方法传递到action(转)
之前写过一篇文章Jquery Ajax方法传值到action,本文是对该文的补充. 假设 controller中的方法是如下: public ActionResult ReadPerson(Perso ...
- 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面
其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...
- hdf第一周完了,突然时间静止.,醒了就早点去公司上班,再努力一点
周一要了个任务,做评价完成,分享完成的页面,做到周四发现可能做不出来,找dzy,逻辑比较混乱,想要放弃了,感觉自己非常没用.昨天跟豆聊了一下,否定自己是一点意义也没有的,觉得自己很差劲,无助的感觉跟初 ...
- 技术再深入一点又何妨?一脸懵B的聊Actor
记得上次深入 Resin 源码时,见到了Actor 字眼,当时主要从 Resin 中抽取关键架构,就屏蔽了 Actor 相关代码.未曾想这两天研究 flink 的运行架构以及源码,再次与 Actor ...
- 再深入一点|binlog和relay-log到底长啥样?
上一篇mysql面试的文章之后收到不少朋友的意见,希望深入讲讲复制.日志的格式这些,今天,我们就来深挖一下mysql的复制机制到底有哪一些,以及binlog和relay-log的结构到底是什么样子的. ...
随机推荐
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
一.概述. Spring与Hibernate的集成在企业应用中是很常用的做法通过Spring和Hibernate的结合能提高我们代码的灵活性和开发效率,下面我就一步一步的给大家讲述Spring如何和H ...
- mysql索引合并:一条sql可以使用多个索引
前言 mysql的索引合并并不是什么新特性.早在mysql5.0版本就已经实现.之所以还写这篇博文,是因为好多人还一直保留着一条sql语句只能使用一个索引的错误观念.本文会通过一些示例来说明如何使用索 ...
- 精简配置plsql developer连接oracle
DB:11.2.0.3.0 OS:oracle-linux 5.7 公司堡垒机为了安全重新规划,各个组只能访问各个组的堡垒机磁盘空间,因此无法访问线上oracle组的磁盘空间,导致plsql deve ...
- poj 3641 Pseudoprime numbers
题目连接 http://poj.org/problem?id=3641 Pseudoprime numbers Description Fermat's theorem states that for ...
- android开发系列之git常用命令
最近因为跳槽到新公司,然后新公司里面的代码管理工具是gitLab,所以我想在这篇博客里面整理一下git常用的语法. GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托 ...
- 6.Knockout.Js(加载或保存JSON数据)
前言 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多数的Ajax应用程 ...
- Go语言工程结构
Go是一门推崇软件工程理念的编程语言. Go的代码必须放在GOPATH目录下,它应该包含三个子目录: src:用于以代码包的形式组织并保存Go源码文件.应该分为三类:库源码文件.命令源码文件.测试源码 ...
- [LAMP]【转载】——PHP7.0的安装
***原文链接:http://my.oschina.net/sallency/blog/541287 php编译过程报错解决可参考:http://www.cnblogs.com/z-ping/arch ...
- 设置搜狗输入法在任何时候按左右两侧的shift激活
如上图,搜狗输入法for linux最近与广大用户见面了,现在的版本是1.0.0.0014,本人系统是ubuntu 14.04非麒麟版本 使用过程中有个习惯就是在任何窗口内只要按任意一侧的shift就 ...
- “我爱淘”冲刺阶段Scrum站立会议6
完成任务: 对大部分的布局已经做好了布置. 计划任务: 实现数据库的链接,将页面功能完善. 遇到问题: 使用webservice对数据的提取,用数据库将书的信息展示软件中.