ajax和它的超时
日常开发中一般都会使得ajax去获了数据,但有两点是需要值得注意的:
1、ajax请求队列
2、ajax的超时处理
为什么要注意这两点?为了让用户在其可视区域内更快速的看见内容。
假设页面结构分为三栏:左、中、右,而且页面数据会比较多,页面呈现的顺序则是是按从上而下执行的(当然是从左至右开始,一个模块一个模块加载数据),如果不采用队列,那么在页面可视范围之外的模块可能已经加载完数据了,而可视范围之内(假设为第一屏)的模块却尚未开始接收数据,这一类应用如:搜狐博客、新浪博客、网易博客等…
既然是采用了队列,那么又会有一个新的问题:需要保证一个请求的时候不能太长,不能因为一个请求而导致后续的请求被阻塞了。在这两点上jQuery做的其实都挺不错的。队列的处理上,已经有一个插件了,叫ajaxManager,例子和链接在这里:http://www.protofunc.com/scripts/jquery/ajaxManager/;而在超时的处理上,jquery本身就支持传递参数timeout来进行设置(默认是没有设置的)。它没有考虑IE8,尽管IE已经支持xhr对象的timeout属性。
从ajax创建开始,这里优化的一点是针对IE浏览器,只循环获取一次使用哪种MSXML库,副作用就是需要使用额外的属性来记录它
function createXHR() {
if (typeof XMLHttpRequest != 'undefined') {
return new XMLHttpRequest();
} else if (typeof ActiveXObject != 'undefined') {
if (typeof arguments.callee.activeXString != 'string') {
var version = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
for (var i = 0, len = version.length; i < len; ++i) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
}
catch (ex){
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error("No XHR object available.");
}
}
( xhr.status >= 200 && xhr.status < 300 ) ||
xhr.status === 304 || xhr.status === 1223 || xhr.status === 0
xhr.setRequestHeader('If-Modified-Since', 'Thu, 1 Jan 1970 00:00:00 GMT');
xhr.setRequestHeader('Cache-Control', 'no-cache');
var xhr = new createXHR();
xhr.onload = function() {
//...
}
xhr.onprogress = function(evt) {
var percent = (evt.position / evt.totalSize)*100;
}
xhr.open("get", url, true);
xhr.send(null);