1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | function ajax(options) { //请求参数 options = { //类型 type: options.type || "Post" , //地址 url: options.url || "" , //超时时间 timeout: options.timeout || 5000, //完成函数 onComplete: options.onComplete || function () { }, //错误函数 onError: options.onError || function () { }, //执行成功 onSuccess: options.onSuccess || function () { }, //传递数据 data: options.data || "" , //返回的数据类型 datatype: options.datatype || "string" , }; //创建请求对象 var xml = new XMLHttpRequest(); //初始化异步请求 xml.open(options.type, options.url, true ); //请求超时时间 var timeoutLength = options.timeout; //请求是否成功 var requestDone = false ; //初始化一个超时执行回调函数,用于取消请求 setTimeout( function () { requestDone = true ; }, timeoutLength); //监听文档状态的更新 xml.onreadystatechange = function () { //保持等待,直到数据完全加载,并保证请求并未超时 if (xml.readyState == 4 && !requestDone) { //检查请求是否成功 if (httpSuccess(xml)) { //以服务器返回的数据作为参数调用成功回调函数 options.onSuccess(httpData(xml, options.datatype)); } else { //发生错误时执行错误回调函数 options.onError(); } //执行完成回调函数 options.onComplete(); //清理文档,避免内存泄露 xml = null ; } }; //建立与服务器的连接 xml.send(); //判断http是否响应成功 function httpSuccess(r) { try { //如果得不到服务器状态且我们正在请求本地文件,认为成功 return !r.status && location.protocol == "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; //若是,获得xml文档对象,否则返回文本内容 data = type == "xml" || data ? r.responseXml : r.responseText; //若指定类型是 script ,则以Javascript形式返回文本 if (type == "script" ) { eval.call(window, data); } else if (type == "json" ) { data = eval(data); } //返回响应数据 return data; } } |
使用
1 2 3 4 5 6 7 8 9 10 11 | ajax({ url: "/Home/GetTestData" , type: "get" , datatype: "json" , onSuccess: function (result) { alert(result); }, onError: function (xhr) { var x = xhr; } }); |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步