发布一个简单小巧的ajax操作类


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

发布一个简单小巧的ajax操作类

看到自编一个精致的ajax框架(带例子) ,也想发布一个自己整理的东东。不过,看了前一句里提到的那篇文章下面的某些评论,还是有点害怕。所以,必须要申明的是,这是笔者参考网络资源整理出来的简单有效的ajax操作类(所谓“框架”这种吓死人不偿命的称呼就免了),对于规模不是太大,不想引用第三方ajax库,ajax操作要求不是太高太频繁的小项目,下面这个东东足够满足需求了。

code

//封装xmlhttp的myajaxobj类的代码

var myajaxobj = new object();

myajaxobj.reqlist = [];

//创建一个xmlhttp对象,兼容不同的浏览器

function getxmlhttp() {

var xmlhttp = false;

var arrsignatures = ["msxml2.xmlhttp.5.0", "msxml2.xmlhttp.4.0",

"msxml2.xmlhttp.3.0", "msxml2.xmlhttp",

"microsoft.xmlhttp"];

for (var i = 0; iarrsignatures.length; i++) {

try {

xmlhttp = new activexobject(arrsignatures[i]);

return xmlhttp;

}

catch (oerror) {

xmlhttp = false; //ignore

}

}

// throw new error("msxml is not installed on your system.");

if (!xmlhttp && typeof xmlhttprequest != 'undefined') {

xmlhttp = new xmlhttprequest();

}

return xmlhttp;

}

/*封装xmlhttp向服务器发送请求的操作

url:向服务器请求的路径;method:请求的方法,即是get/post;***callback:当服务器成功返回结果时,调用的函数(类似c#回调函数)***

data:向服务器请求时附带的数据;urlencoded:url是否编码;cached:是否使用缓存; callbackerror;当服务器返回错误时调用的函数

*/

myajaxobj.send = function(url, method, callback, data, urlencoded, cached, callbackerror) {

var req = getxmlhttp();//得到一个xmlhttp的实例

//当xmlhttp的请求状态发生改变时调用 (核心处理函数)

req.onreadystatechange = function() {

// 当请求已经加载

if (req.readystate == 4) {

// 当请求返回成功

if (req.status == 200) { //或者 req.status

// 当定义了成功回调函数时,执行成功回调函数

if (callback)

callback(req, data);

}

// 当请求返回错误

else {

//当定义了失败回调函数时,执行失败回调函数

if (callbackerror)

callbackerror(req, data);

}

//删除xmlhttp,释放资源

try {

delete req;

req = null;

} catch (e) { }

}

}

//如果以post方式回发服务器

if (method.touppercase() == "post") {

req.open("post", url, true);

//请求是否需要缓存(只有在req.open之后才可以设置此项)

if (cached)

req.setrequestheader("if-modified-since", "0");

//请求需要编码

if (urlencoded)

req.setrequestheader('content-type', 'application/x-www-form-urlencoded');

req.send(data);

myajaxobj.reqlist.push(req);

}

//以get方式请求

else {

req.open("get", url, true);

//请求是否需要缓存

if (cached)

req.setrequestheader("if-modified-since", "0");

req.send(null);

myajaxobj.reqlist.push(req);

}

return req;

}

//全部清除xmlhttp数组元素,释放资源

myajaxobj.clearreqlist = function() {

var len = myajaxobj.reqlist.length;

for (var i = 0; ilen; i++) {

var req = myajaxobj.reqlist[i];

if (req) {

try {

delete req;

} catch (e) { }

}

}

myajaxobj.reqlist = [];

}

//进一步封装xmlhttp以post方式发送请求时的代码

//isclear:是否清除xmlhttp数组的所有元素;其他参数的意义见 myajaxobj.send

myajaxobj.sendpost = function(url, data, callback, isclear, iscached, callbackerror) {

if (isclear) {

myajaxobj.clearreqlist();

}

myajaxobj.send(url, "post", callback, data, true, iscached, callbackerror); //post方法需要编码

}

//进一步封装xmlhttp以get方式发送请求时的代码

myajaxobj.sendget = function(url, args, callback, isclear, iscached, callbackerror) {

if (isclear)

myajaxobj.clearreqlist();

return myajaxobj.send(url, "get", callback, args, false, iscached, callbackerror);

}

调用方式举例:

我的一篇旧文“ajax:简单搜索实践篇”里实现了googlesuggest效果,可以把代码改造成下面的调用方式,具体细节不再赘述了。

/*调用方式举例(googlesuggest效果):

myajaxobj.sendpost("ajaxoperations.aspx", null, googlesuggestcallback, true,true, googlesuggestcallbackerror);

或者 myajaxobj.sendget("ajaxoperations.aspx", null, googlesuggestcallback, false,true, googlesuggestcallbackerror);

*/

注意:

post方式通常需要编码,get不需要;

倒数第二个参数代表缓存,设置为false,可以“解决ajax调用中ie的缓存问题”;

网上有创建xmlhttprequest池的改进方式,这里没有考虑一次创建多个xmlhttprequest的情况(实际用的也不多);

对于熟练使用第三方ajax库(如微软自带的ajax框架集,jquery等)的读者,还是推荐使用成熟的ajax库。

再次重申,本人在博客园的所有技术博客除非已经标注“原创”二字,否则都是在参考他人的成果基础上整理加工而成。可能你已经看过笔者的其他博客,所以你觉得有gjm的嫌疑,千万别怀疑你的感觉。很不hd地说,对于抄书和剽窃,一直以来我都是深以为耻的。从我写技术博客的那天起,我就在等待完全是自己的原创问世。但是技术能力实在有限,原谅我无奈地借鉴他人的成果,以后我一定会加上原文出处的,但是该借鉴的继续借鉴,该学习的继续学习,哪有空装13搞什么原创呢,莫装13,原创真的很难啊。

最后,欢迎拍砖。

作者:jeff wong

出处:http://jeffwongishandsome.cnblogs.com/

本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。

绿色通道:好文要顶关注我收藏该文与我联系

posted on 2009-09-25 16:33 jeff wong 阅读(355) 评论(0)编辑 收藏


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值