完整的Ajax程序包
发布时间:2020-12-16 00:32:52 所属栏目:百科 来源:网络整理
导读:/* * 完整的Ajax程序包 * */ //执行 Ajax 请求的通用函数 //带一个参数,是包含一系列选项的对象,这些选线在下面的注释中简述 function ajax( options ) { //如果用户没有提供某个选项的值,就用默认值替代 options = { // Http 请求的类型 type : options.
/* * 完整的Ajax程序包 * */ //执行 Ajax 请求的通用函数 //带一个参数,是包含一系列选项的对象,这些选线在下面的注释中简述 function ajax( options ) { //如果用户没有提供某个选项的值,就用默认值替代 options = { // Http 请求的类型 type : options.type || "POST",//请求的 URL url : options.url || "",// 请求超时哦的时间 timeout : options.timeout || 5000,// 请求失败、成功或者完成(不管成功还是失败都会调用的)时执行的函数 onComplete: options.onComplete || function(){},onError : options.onError || function(){},onSuccess : options.onSuccess || function(){},// 服务器将返回的数据类型,这一默认值用于判断服务器返回的数据 data : options.data || "" }; //创建请求对象 var xml = new XMLHttpRequest(); //初始化异步请求 xml.open( options.type,options.url,true ); // 我们在请求后等待 5 秒,超时则放弃 var timeoutLength = options.timeout; //记录请求是否完成 var requestDone = false; //初始化一个 5 秒后执行的回调函数,用于取消请求(如果尚未完成的话)。 setTiemout(function(){ requestDone = true; },timeoutLength); //监听文档状态的更新 xml.onreadystatechange = function(){ // 保持等待,直到数据完全加载,并保证请求未超时 if ( xml.readyState == 4 && !requestDone ){ // 检查是否请求成功 if ( httpSuccess( xml ) ){ //以服务器返回的数据作为参数调用成功回调函数 options.onSuccess( httpData( xml,options.type ) ); // 否则就发生了错误,执行错误回调函数 } else { options.onError(); } // 调用完成回调函数 options.onComplete(); // 为避免内存泄漏,清理文档 xml = null; } }; // 建立与服务器的连接 xml.send(); // 判断 HTTP 响应是否成功 function httpSuccess(r){ try { // 如果得不到服务器状态,且我们正在请求本地文件,认为成功 return !r.status && location.protocal == "file:" || //所有 200 到 300 间的状态码表示成功 ( r.status >= 200 && r.status < 300 ) || //文档未修改也算成功 r.status == 304 || //Safari 在文档修改时返回空状态 navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined"; } catch(e){} //若检查状态失败,就假定请求时失败的 return false; } // 从 Http 响应中解析正确数据 function httpData(r,type) { // 获取 content-type 的首部 var ct = r.getResponseHeader("content-type"); //若没有提供默认的类型,判断服务器返回的是否是 XML 形式 var data = !type && ct && ct.indexOf("xml") >= 0; if( type == "Script") eval.call( window,data ); // 返回响应数据 (或为 XML 文档或为文本字符串) return data; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |