您的位置:首页 > 其它

实现发送多个Ajax请求

2012-02-01 00:25 239 查看
======================================================

注:本文源代码点此下载

======================================================

实现发送多个ajax请求
大家知道ie只能一次发送一个ajax请求,你是否尝试过在一个页面上用ajax请求多次,虽然可以实现我们发现代码很乱
我们来实现一个在页面呈现缓存的例子吧!
//获取dom
function $(id) { return document.getelementbyid(id); }
思路:我们把要加载的缓存放在一个集合中,再迭代集合实现所有的获取缓存请求
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)
var cache={page:"index",id:"courses",element:$("courses")};
//page为加载的缓存页面 id缓存id,element显示缓存的dom对象
顺便插一句:这个例子用jquery实现的了吗?可以尝试一下,呵呵,这几天好像跟jquery有仇一样
上面定义了缓存对象,下面的代码就创建一个请求ajax的方法,我们称之为: asyncrequest
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)
var xmlhttp = null;
function $asyncrequest(request, callback) {
this.method = request.method!=null&&request.method.tolowercase()=="post"?"post":"get";
this.url = request.url;
this.params = request.params;
this.datatype =request.datatype!=null&&request.datatype.tolowercase() == "xml" ? "xml" : "text";
this.async = request.async instanceof boolean ? request.async : true;
if (callback != null) {
this.success = callback.success;
this.error = callback.error;
if (callback.start != null) callback.start();
}
if (xmlhttp == null) {
if (window.xmlhttprequest) xmlhttp = new xmlhttprequest();
else if(window.activexobject)xmlhttp=new activexobject("msxml2.xmlhttp")||new activexobject("microsoft.xmlhttp");
else{return false;}
}
var current = this;
xmlhttp.open(this.method, this.url, this.async);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readystate == 4) {
if (xmlhttp.status == 200) {
if (current.success != null)
current.success(current.datatype == "xml" ? xmlhttp.responsexml : xmlhttp.responsetext);
}
else {
if (current.error != null)
current.error(xmlhttp.responsetext);
}
}
}
if (this.method== "post")
xmlhttp.setrequestheader("content-type", "application/x-www-form-urlencoded");
xmlhttp.send(this.params);
}
调用asyncrequest方法实例:
$asyncrequest({ url:"http://127.0.0.1",method:"get",async:true,datatype:"text" },
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)
{ start: function () {//开始请求执行 },
error:function(){//请求错误时执行},
success: function (x) {//成功获取结果为x}
});
//简单的就可以像下面这样调用
$asyncrequest({ url: "/default.htm"}, {
success: function (x) {alert(x);}
});
好了,下面我们来请求获取缓存内容并显示出来了!新建一个方法叫loadcache()
function loadcache(cache,callback) {
this.requesturl = "/handler/cacheashtml.ashx?cache.page=" + cache.page +
"&cache.guid=" + cache.id + (cache.params != null ? "&" + cache.params : "")+"&"+math.random();
var nodename=cache.element.nodename;
if (nodename != null && (nodename == "div" || nodename == "span")) {
var element = cache.element;
} else { alert('不支持的元素(div,span)' + nodename); return false; }
$asyncrequest({ url: this.requesturl }, { start: function () { element.innerhtml = "加载中!"; },
success: function (x) {element.innerhtml = x;if (callback != undefined) callback(); }
});
}
我们加载显示一个缓存就可以这样调用
loadcache({ page: "index", id: "neariprice", element: $("iprice"));
我们发现请求一个请求并不难,但是要请求多个时候就遇到问题了..
先将要请求的缓存放到一个集合中:
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)




code
window.caches = [{ page: _p, id: "vipschoolarchive", element: $("viparchives") },
{ page: _a, id: "defaultpageviparchivesrightpart", element: $("viparchivead") },
{ page: _a, id: "defaultpageviparchivesbottompart", element: $("viparchiveadbottom")}];
我们现在就要请求这所有的虎头缓存了!吃饭了直接上代码...呵呵
window.caches = [{ page: _p, id: "vipschoolarchive", element: $("viparchives") },
{ page: _a, id: "defaultpageviparchivesrightpart", element: $("viparchivead") },
{ page: _a, id: "defaultpageviparchivesbottompart", element: $("viparchiveadbottom")}];
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)
loadcachecollection(window.caches);
function loadcachecollection(cachearray) {
cachearray.reverse();
var s = setinterval(function () {
for (var i in cachearray) {
loadcache(cachearray[i],
function () {
cachearray.pop(cachearray[i]);
if (cachearray.length == 0) clearinterval(s);
});
}
}, 10);
}
欢迎拍砖:sonven 顺便灌一个网址上去方便seo:http://www.rsion.com
(rsion.com,锐讯,巴中广州佛山成都网站建设,newmin,new.min,new.min@msn.com,newmin.net,巴中网站建设tel:18608275575锐讯)
原创内容请您保留出处及地址,我的网站: www.ops.cc厦门装修公司
标签:
javascript, jquery,
.net, asp.net
绿色通道:好文要顶关注我收藏该文与我联系



posted @ 2009-11-03 12:16
new.min 阅读(2428)
评论(7)编辑
收藏
发表评论
1733148
回复 引用 查看
#1楼 2009-11-03 12:55 lonely~

请求队列?
同步请求还好说,异步的话似乎有点问题。
一个思路:异步队列每个任务完成/出错时,都要显式地向队列报告自己的状态,由队列决定是继续下一个还是停止/报错。这样异步任务也可以受到控制了。
瞎想的,别拍转,呵呵。
回复 引用 查看
#2楼 2009-11-03 15:24 kkcat

引用lonely~:
请求队列?
同步请求还好说,异步的话似乎有点问题。
一个思路:异步队列每个任务完成/出错时,都要显式地向队列报告自己的状态,由队列决定是继续下一个还是停止/报错。这样异步任务也可以受到控制了。
瞎想的,别拍转,呵呵。
回复 引用 查看
#3楼[楼主] 2009-11-03 16:39 sonven

@kkcat
@lonely~
呵呵,真厉害!
回复 引用
#4楼 2009-11-03 19:14 1256951[未注册用户]
good
文章不错,支持下
给大家推荐个新闻网,http://ivava.cn/
回复 引用 查看
#5楼 2009-11-06 20:26 司徒正美

for (var i in cachearray) {
loadcache(cachearray[i],
function () {
cachearray.pop(cachearray[i]);
if (cachearray.length == 0) clearinterval(s);
});
}
这里有点问题,你每次取出第一个,然后发出去后,再把第一个删掉就是,基本不用循环!
setinterval也不用,你发出请求后,这个函数再动不了,然后等ajax成功返回,利用ajax再次调动此函数即可。当然cachearray长度为零,ajax也应该调用不了它。
回复 引用 查看
#6楼[楼主] 2009-11-11 09:10 sonven

@司徒正美
哈哈,谢谢指点,,学习啦
回复 引用 查看
#7楼 2009-12-25 10:49 hei

学习中
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页
首页博问闪存新闻园子招聘知识库
最新it新闻:
·android平台12月广告浏览份额51.6% 超越ios
·测试版ios源代码显示ipad 3或将支持siri
·斯蒂芬·霍金的新电脑
·京东商城2.95亿竞得北京商业地一块
·美报业巨头合作facebook谷歌 传媒重视网络网络
»
更多新闻...
最新知识库文章:
·javascript 面向对象编程
·持续集成之“everything is code”
·持续集成之“软件自我识别”
·持续集成之戏说check-in dance
·什么是闭包。

我的理解
»
更多知识库文章...



china-pub 2011秋季教材巡展
china-pub 计算机绝版图书按需印刷服务

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: