$.ajax({url:"test.php", //发送请求的URL字符串type:"GET", //发送方式 dataType:"json", //预期服务器返回的数据类型 xml, html, text, json, jsonp, scriptdata:"k=v&k=v", //发送的数据 async: true,//异步请求 cache: false, //缓存 timeout:5000,//超时时间 毫秒beforeSend: function(){},//请求之前error: function(){},//请求出错时success:function(){},//请求成功时complete:function(){}//请求完成之后(不论成功或失败)});这样的调用是不是很舒适、方便,如果感觉舒适那自己动手写也参照这种设计方式,不用太复杂,满足所需就好。
xhr.onreadystatechange = function(){if( xhr.readyState == 4 && xhr.status == 200 ){//准备就绪 可以处理返回的 xhr.responseText 或者 xhr.responseXML }};
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");xhr.onreadystatechange = function(){if( xhr.readyState == 4 && xhr.status == 200 ){//准备就绪 可以处理返回的 xhr.responseText 或者 xhr.responseXML }};xhr.open(method,url,async);xhr.send(string);
url += (url.indexOf("?") < 0 ? "?" : "&") + "_="+ (+new Date());xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var $ = (function(){//辅助函数 序列化参数 function param(data){//..} function ajax(opts){var _opts = {url: "/", //发送请求URL地址type: "GET",//发送请求的方式 GET(默认), POSTdataType: "",//预期服务器返回的数据类型 xml, html, text, json, jsonp, scriptdata: null, //发送的数据 "key=value&key=value", {key:value,key:value}async : true, //异步请求 ture(默认异步), falsecache : true, //缓存 ture(默认缓存), false timeout: 5,//超时时间 默认5秒load: function(){}, //请求加载中error : function(){}, //请求出错时success: function(){}, //请求成功时complete: function(){} //请求完成之后(不论成功或失败)}, aborted = false, key,xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");for(key in opts) _opts[key] = opts[key]; /*if(_opts.dataType.toLowerCase() === "script"){//..}if(_opts.dataType.toLowerCase() === "jsonp"){//..}*/if(_opts.type.toUpperCase() === "GET"){if(param(_opts.data) !== ""){_opts.url += (_opts.url.indexOf("?") < 0 ? "?" : "&") + param(_opts.data);}!_opts.cache && ( _opts.url += (_opts.url.indexOf("?") < 0 ? "?" : "&") + "_="+(+new Date()) );} function checkTimeout(){if(xhr.readyState !== 4){aborted = true;xhr.abort();}}setTimeout(checkTimeout, _opts.timeout*1000); xhr.onreadystatechange = function(){if( xhr.readyState !== 4 ) _opts.load && _opts.load(xhr);if( xhr.readyState === 4 ){var s = xhr.status, xhrdata;if( !aborted && ((s >= 200 && s < 300) || s === 304) ){switch(_opts.dataType.toLowerCase()){case "xml":xhrdata = xhr.responseXML;break;case "json":xhrdata = window.JSON && window.JSON.parse ? JSON.parse(xhr.responseText) : eval("(" + xhr.responseText + ")");break;default:xhrdata = xhr.responseText;}_opts.success && _opts.success(xhrdata,xhr);}else{_opts.error && _opts.error(xhr);}_opts.complete && _opts.complete(xhr);}}; xhr.open(_opts.type,_opts.url,_opts.async);if(_opts.type.toUpperCase() === "POST"){xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");}xhr.send(_opts.type.toUpperCase() === "GET" ? null : param(_opts.data));}return {ajax: ajax}})();定义好了参数选项,来分析一下。其中 dataType 是整个ajax的重点,代码的简单或者复杂都在它了。
这上图中 a.html中请求了 http://www.b.com/b.php?callback=add (在ajax程序中请求url就是这个链接),在b.php中读取了传过来的参数 callback=add 根据获取到的参数值(值为add),以JS语法生成了函数名,并把json数据作为参数传入了这个函数,返回以JS语法生成的文档给a.html,a.html解析并执行返回的JS文档,调用了定义好的add函数。
在程序中一般采用更通用的方式去调用,比如下面这个广泛使用的loadJS函数:
function loadJS(url, callback) {var doc = document, script = doc.createElement("script"), body = doc.getElementsByTagName("body")[0];script.type = "text/javascript";if (script.readyState) { script.onreadystatechange = function() {if (script.readyState == "loaded" || script.readyState == "complete") {script.onreadystatechange = null;callback && callback();}};} else { script.onload = function() {callback && callback();};}script.src = url;body.appendChild(script);}这样把请求的url,传入loadJS函数,得到一样的结果。
function addJS(text) {var doc = document, script = doc.createElement("script"), head = doc.getElementsByTagName("body")[0];script.type = "text/javascript";script.text = text;body.appendChild(script);}到此ajax差不多分析完了,根据实际需要,添加各种功能,去思考每种功能是怎样实现的,并能找到解决方法。