Skip to content

Instantly share code, notes, and snippets.

@greycode
Last active December 17, 2015 02:49
Show Gist options
  • Save greycode/5538624 to your computer and use it in GitHub Desktop.
Save greycode/5538624 to your computer and use it in GitHub Desktop.
简单的AJAX调用封装,传入参数仿jQuery.ajax
/***
* 简单的异步调用封装,传入参数仿jQuery,其中url为必填项
* @example
* 示例参数如下:<pre>
* var ajaxOption = {
* type : "" , // GET/POST
* url : "" ,
* data : "" , // 传入参数
* beforeSend : function() {},
* complete : function() {},
* error : function() {},
* success : function(resp) {} // 响应方法
* } </pre>
* @param {} obj
*/
function asyncCall(obj) {
// 引入jQuery时 可以将该方法实现替换为jQuery.ajax(obj);
if (window.ActiveXObject) {
syncReq = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
syncReq = new XMLHttpRequest();
}
// INFO 对于302重定向的情况,status总是返回 200,
// 可以通过syncReq.getResponseHeader('location') 来判断并修正
syncReq.onreadystatechange = function() {
var state = syncReq.readyState;
if (state == 4) {
try {
if ( syncReq.status == 200|| syncReq.status === 304 ) {
// responseBody / responseText / responseXML
if (obj.success) obj.success(syncReq.responseText);
} else {
if (obj.error) obj.error();
}
} catch (e) { }
if (obj.complete) obj.complete();
}
}
var reqType = (obj.type && obj.type == "POST" ) ? "POST" : "GET";
var reqData = obj.data ? obj.data : "";
if (reqType == "GET") { obj.url += reqData; reqData = null; }
syncReq.open(reqType, obj.url, true);
if (reqType == "POST") {
// POST参数 需要将‘键=值’分别编码encodeVal,然后用‘&’拼接起来
syncReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
reqData = encodePostData(reqData);
}
if (obj.beforeSend) obj.beforeSend();
syncReq.send(reqData);
}
/**
* 编码POST参数
* @private asyncCall
* @param {} data
* @return {}
*/
function encodePostData(data) {
var kvs = data.split("&");
for (var i = 0;i < kvs.length; i++) {
var kv = kvs[i].split("=");
if (kv.length == 2) {
kv[0] = encodeVal(kv[0]);
kv[1] = encodeVal(kv[1]);
kvs[i] = kv.join("=")
}
}
return kvs.join("&")
}
/**
* 以当前页面编码(如GBK)编码字符,可完全替代encodeURIComponent<br>
* 因encodeURIComponent 始终以UTF-8编码,AJAX采用POST提交时会出现乱码
* @param {} s
* @return {}
*/
function encodeVal(s) {
// escapeDBC 对多字节字符编码的函数
function escapeDBC(s) {
if (!s) return ""
if (window.ActiveXObject) {
// 如果是 ie, 使用 vbscript
execScript('SetLocale "zh-cn"', 'vbscript');
return s.replace(/[\d\D]/g, function($0) {
window.vbsval = "";
execScript('window.vbsval=Hex(Asc("' + $0 + '"))', "vbscript");
return "%" + window.vbsval.slice(0,2) + "%" + window.vbsval.slice(-2);
});
} else {
// 或者可以使用img
var link = document.createElement("a");
// 其它浏览器利用浏览器对请求地址自动编码的特性
link.href = "nothing.action?separator=" + s;
return link.href.split("?separator=").pop();
}
}
// 把多字节字符与单字节字符分开,分别使用 escapeDBC 和 encodeURIComponent 进行编码
return s.replace(/([^\x00-\xff]+)|([\x00-\xff]+)/g, function($0, $1, $2) {
return escapeDBC($1) + encodeURIComponent($2||'');
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment