function ajax(options) { ???options = options || {}; ???options.type = (options.type || "GET").toUpperCase(); ???options.dataType = options.dataType || ‘json‘; ???options.async = options.async || true; ???options.timeout=options.timeout||8000;//超时处理,默认8s ???var params = getParams(options.data); ???var timeoutFlag=null; ???var xhr; ???var that=this; ???if (window.XMLHttpRequest) { ???????xhr = new XMLHttpRequest(); ???} else { ???????xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘) ???} ???xhr.onreadystatechange = function() { ???????if(options.dataType === ‘json‘){ ???????????if (xhr.readyState == 4) { ???????????????window.clearTimeout(that.timeoutFlag); ???????????????var status = xhr.status; ???????????????if (status >= 200 && status < 300) { ???????????????????// 如果需要像 html 表单那样 POST 数据,请使用 setRequestHeader() 来添加 http 头。 ???????????????????options.success && options.success(xhr.responseText, xhr.responseXML); ???????????????} else { ???????????????????options.fail && options.fail(status); ???????????????} ???????????} ???????} else { ???????????if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { ???????????????window.clearTimeout(that.timeoutFlag); ???????????????var oScript = document.createElement(‘script‘); ???????????????document.body.appendChild(oScript); ???????????????var callbackname = ‘ajaxCallBack‘ ???????????????oScript.src = options.url + "?" + ?params+‘&callback=‘+callbackname; ???????????????window[‘ajaxCallBack‘] = function(data) { ???????????????????options.success(data); ???????????????????document.body.removeChild(oScript); ???????????????}; ???????????} ???????} ???}; ???if (options.type == ‘GET‘) { ???????xhr.open("GET", options.url + ‘?‘ + params, options.async); ???????xhr.send(null) ???} else if (options.type == ‘POST‘) { ???????xhr.open(‘POST‘, options.url, options.async); ???????if(options.contentType=="undefined"||options.contentType==null){ ???????????xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘); ???????????xhr.send(params); ???????}else{ ???????????xhr.setRequestHeader(‘Content-Type‘, options.contentType); ???????????xhr.send(JSON.stringify(options.data)); ???????} ???} ???this.timeoutFlag=window.setTimeout(function(){//计时器,超时后处理 ???????window.clearTimeout(that.timeoutFlag); ???????//options.fail("timeout"); ???????xhr.abort(); ???}.bind(this),options.timeout);}function getParams(data) { ???var arr = []; ???for (var param in data) { ???????arr.push(encodeURIComponent(param) + ‘=‘ + encodeURIComponent(data[param])); ???} ???return arr.join(‘&‘);}
调用方法:
ajax({ ???url: "", //请求地址 ???type: ‘GET‘, //请求方式 ???async:true,//同步异步设置 ???timeout:8000,//超时设置 ???data: { ???????name: ‘‘, ???????age: ‘‘, ???????email: ‘‘ ???}, //请求参数 ???success: function(response, xml) { ???????console.log(response); // ??此处执行请求成功后的回调 ???}, ???fail: function(status) { ???????console.log(‘状态码为‘ + status); // 此处为请求失败后的回调 ???}});
function ajax(options) {
???options = options || {};
???options.type = (options.type || "GET").toUpperCase();
???options.dataType = options.dataType || ‘json‘;
???options.async = options.async || true;
???options.timeout=options.timeout||8000;//超时处理,默认8s
???var params = getParams(options.data);
???var timeoutFlag=null;
???var xhr;
???var that=this;
???if (window.XMLHttpRequest) {
???????xhr = new XMLHttpRequest();
???} else {
???????xhr = new ActiveXObject(‘Microsoft.XMLHTTP‘)
???}
???xhr.onreadystatechange = function() {
???????if(options.dataType === ‘json‘){
???????????if (xhr.readyState == 4) {
???????????????window.clearTimeout(that.timeoutFlag);
???????????????var status = xhr.status;
???????????????if (status >= 200 && status < 300) {
???????????????????// 如果需要像 html 表单那样 POST 数据,请使用 setRequestHeader() 来添加 http 头。
???????????????????options.success && options.success(xhr.responseText, xhr.responseXML);
???????????????} else {
???????????????????options.fail && options.fail(status);
???????????????}
???????????}
???????} else {
???????????if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
???????????????window.clearTimeout(that.timeoutFlag);
???????????????var oScript = document.createElement(‘script‘);
???????????????document.body.appendChild(oScript);
???????????????var callbackname = ‘ajaxCallBack‘
???????????????oScript.src = options.url + "?" + ?params+‘&callback=‘+callbackname;
???????????????window[‘ajaxCallBack‘] = function(data) {
???????????????????options.success(data);
???????????????????document.body.removeChild(oScript);
???????????????};
???????????}
???????}
???};
???if (options.type == ‘GET‘) {
???????xhr.open("GET", options.url + ‘?‘ + params, options.async);
???????xhr.send(null)
???} else if (options.type == ‘POST‘) {
???????xhr.open(‘POST‘, options.url, options.async);
???????if(options.contentType=="undefined"||options.contentType==null){
???????????xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);
???????????xhr.send(params);
???????}else{
???????????xhr.setRequestHeader(‘Content-Type‘, options.contentType);
???????????xhr.send(JSON.stringify(options.data));
???????}
???}
???this.timeoutFlag=window.setTimeout(function(){//计时器,超时后处理
???????window.clearTimeout(that.timeoutFlag);
???????//options.fail("timeout");
???????xhr.abort();
???}.bind(this),options.timeout);
}
function getParams(data) {
???var arr = [];
???for (var param in data) {
???????arr.push(encodeURIComponent(param) + ‘=‘ + encodeURIComponent(data[param]));
???}
???return arr.join(‘&‘);
}
原生js封装ajax方法,包含jsonp和网络超时处理
原文地址:https://www.cnblogs.com/ziqingmo/p/10515631.html