看了网上js,ajax,jq不同或是区别,吵得不可开交。有那个闲工夫看看web技术,尤其是web api((js作为工具,有好多功能调用的webapi)),它不香吗??
个人认为ajax,是一个新概念,就跟印刷术(js)和活字印刷术(ajax),本质还是js(小样儿,穿个马甲还认识你),最主要得作用也是最常用的是“异步”(就是不用整个页面都刷新,局部改变)。
下面封了个方法
var _Util = {};
//ajax请求
_Util.ajax = function (req) {
req = {
method: req.method || "POST",
url: req.url || "",
param: req.param || "",
upload: req.upload || false,
timeout: req.timeout || 20000,
success: req.success || function () { },
error: req.error || function () { },
complete: req.complete || function () { },
overtime: req.overtime || function () { },
async: req.async || true
};
var xhr = (function () {
if(typeof XMLHttpRequest !== 'undefined'){
return new XMLHttpRequest();
} else if (typeof ActiveXObject !== 'undefined') {
if(typeof arguments.callee.activeXString != 'string')
{
//不懂这三个得,自己去查
var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for (var i = 0, len = versions.length; i < len; i++) {
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
} catch (ex) {
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error('No XHR object available');
}
}());
//请求路径
req.url = req.url + (req.url.indexOf('?') == -1 ? '?' : '');
//参数,一个json,{key:val, key1:val1, ......}
req.param = (function (p) {
if(req.upload){
var fd = new FormData();
for (var o in p)
p.hasOwnProperty(o) && fd.append(p[0]);
return fd;
}else{
var arr = [];
for (var o in p)
arr.push(encodeURIComponent(o) + '=' + encodeURIComponent(p[o]));
return arr.join('&');
}
})(req.param);
//方法
if (req.param !== '' && req.method.toUpperCase() === 'GET') {
req.url += req.param;
}
//异步,回调方法的定义
if(req.async){
xhr.onreadystatechange = function () {
if ((xhr.readyState == 4 || xhr.readyState == 'complete') && !requestDone) {
callback();
}
}
}
//发送请求
xhr.open(req.method, req.url, req.async);
var requestDone = false;
var timeid = setTimeout(function () {
requestDone = true;
req.overtime();
}, req.timeout);
//post补上参数
if (req.method.toUpperCase() === 'POST') {
if (!req.upload)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
//不理解这一步的,可以下下面formdata的案例,地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects
xhr.send(req.param);
} else {
xhr.send(null);
}
//回调
function callback() {
if (timeid != 0) {
window.clearTimeout(timeid);
timeid = 0;
}
if (xhr.status == 200) {
req.success(xhr.responseText);
} else{
req.error(xhr.status, xhr.statusText);
}
req.complete();
xhr = null;
}
}