实现发送多个Ajax请求

来源:互联网 发布:电脑c盘的windows文件 编辑:程序博客网 时间:2024/06/01 14:36

======================================================
注:本文源代码点此下载
======================================================

实现发送多个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:16new.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^)/
原创粉丝点击