简单通用Ajax函数

 1 //一个简单的执行ajax的通用函数
 2 //带一个参数,参数为对象,需要传送的东西,都在里面
 3 function ajax(options){
 4   //如果没有传入响应的值,就用默认的代替
 5   options = {
 6         //HTTP请求类型
 7         type : options.type || "POST",
 8         //请求的URL
 9        url : options.url || "www.XXX.com/XXX.php?",
10         //请求的超时时间
11         timeout : options.timeout || 5000,
12        //请求失败、成功、完成
13        onComplete : options.onComplete || function(){alert(请求成功)},
14        onError : options.onError || function(){alert(请求失败)},
15         onSuccess : options.onSuccess || function(){alert(请求完成)},
16         //服务器返回的数据类型,用于判断服务器返回的数据。从而进行操作
17         date : options.date || " "
18   }
19 
20   //创建XML对象
21   var xml = new XMLHttpRequest();
22   //初始化异步请求
23   xml.open(options.type,options.URL,ture);
24   //记录请求是否成功完成
25   var requestDone = false;
26   //初试一个回调函数,用于取消函数
27   setTimeout(function(){
28     requestDone = true;
29   },options.timeout);
30   
31   //监听文档状态的更新
32   xml.onreadystatechange = function(){
33     //保持等待,知道数据加载完成,并保证请求未超时
34     if(xml.readyState == 4 && !requestDone){
35       //检查是否请求成功
36       if(httpSuccess(xml)){
37         //以服务器返回的数据作为参数调用成功回调函数
38         options.onSuccess(httpDate(xml,Date,options.type));
39       }else{
40         //否则就是发生了错误,执行Error
41         options.onError(); 
42       }
43       //调用完成回调函数
44       options.onComplete();
45       //避免内漏,清理文档
46       xml = null;
47     }
48   }
49   
50   //建立与服务器的连接
51   xml.send();
52   
53   //判断Http响应是否成功
54   function httpSuccess(r){
55     try{
56       //如果得不到服务器状态,且正在请求本地文件,则认为成功
57       return !r.status && location.protocolo = "file :" ||
58       //所有200到300的状态码都认为成功
59       (r.status > 200 && r.statys < 300) ||
60       //文档未被修改也算成功
61       r.statys == 304 ||
62       //safiri 在文档未被修改时返回空状态
63       navigator.userAgent.indexof("Safiri") >= 0 && typeof r.status == "undefind";
64     }catch(e){}
65     //若检查状态失败,则假设请求失败
66     return false;
67   }
68   
69   //从 Http 响应中解析正确数据
70   function httpDate(r,type){
71     //获取 content-type 的首部
72     var ct = r.getResponseHeader("content-type");
73     //若没有提供默认类型,则判断服务器返回的是否是 xml 数据
74     var date = !type && ct && ct.indexof("xml") >= 0;
75     //若是,获取 xml 对象,否则返回文本内容
76     date = type == "xml" || date ? r.resposeXML : r.resposeText;
77     //若指定类型为 script ,则以 javascript 的形式执行返回文本
78     if(type == "script"){
79       eval.call(window,date); 
80     }
81     //返回响应数据(或为xml或为字符串)
82     return date;
83   } 
84 }

 

posted @ 2012-12-04 11:29  Amas.lee  阅读(163)  评论(0编辑  收藏  举报