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 //否则就是发生了错误,执行Error41 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 }