哪些是公共不变的? 哪些是可以改变的或者将来需要改变的,把这些改变的作为参数。 创建ajax 打开页面 发送数据 添加监听 这些是不变 可以改变的: config = { type:"请求类型" get||post, url:"请求地址", async:true,是否异步默认值true cache:false,是否缓存,默认不缓存 data:{},数据默认json格式 success:function(){},请求成功后的回调函数 beforeSend:function(){},发送请求之前要执行的回调函数 可以放在open之前或者send之前 complete:function(){} ,请求完成无论 成功或失败都要执行。 是readyState==4 请求完成。 } 需要将json数据转换成get参数格式 判断是否是post请求 //将变量闭包在匿名函数里面 (function () { //将json数据转换为get function jsonToget(data) { var str = ""; //1.遍历(循环) json数据 for (var i in data) { //2.将属性名与值连接起来 属性名=属性值& str += i + "=" + data[i] + "&"; } //3.去除最后一个多余的&符号 str = str.replace(/&+$/, ""); return str; } //将自己写的调用与默认的合并 function merge(ini){ //配置默认选项 var config={ type: "get", url: "", async: true, cache: false, data: {}, success: function() {}, beforeSend: function() {}, complete: function() {} }; //如果没有传递参数,则默认为空对象 ini=ini||{}; //创建一个变量不给值,这就是undefined 用于比较属性是否是undefined var z; //遍历默认选项,即使传进来的是选项中没有属性也不会被添加进来 for(var i in config){ //i就是配置属性名,从ini中找这个对应的数据,有就覆盖当前配置,没有就用之前默认的配置 config[i] = ini[i]===z?config[i]:ini[i]; } return config; } //封装ajax函数 function ajax(config) { //使用merge将config初始化合并一下 config = merge(config); //创建ajax对象 var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsoft.XMLHTTP"); //先去判断请求是否是post var isPost = /post/i.test(config.type); //无论是get还是post都要把json数据转化成get参数类型 config.data = jsonToget(config.data); //如果是get方式要判断是否要缓存,如果不要缓存 就加时间戳。向地址上加时间的时候要判断之前是否有?号 if (!isPost) { config.url += (config.url.indexOf('?') > -1 ? '&' : '?') + config.data + "&" + (config.cache ? '' : new Date().getTime() + '=1'); } //打开地址 xhr.open(config.type, config.url, config.async); //如果是post,添加请求头 if (isPost) { xhr.setRequestHeader("content-type", 'application/x-www-form-urlencoded'); } //执行发送之前的回调函数 要执行回调函数一定要先判断它是不是函数!!!! if (typeof config.beforeSend == "function") { config.beforeSend(); } //发送数据 xhr.send(config.data); //添加监听事件 xhr.onreadystatechange = function () { //判断请求是否完成 if (xhr.readyState == 4) { //若请求完成,并有回调函数执行,不管请求是否成功 if (typeof config.complete == "function") { //为了方便以后的调试把访问状态码也传给回调函数,最好把xhr对象也传给它。 config.complete(xhr.status, xhr); } //如果请求成功就执行success函数 if (typeof config.success == "function") { config.success(xhr.responseText, xhr); } } } } //将ajax变为全局变量 window.ajax = ajax; })();