Last active
December 17, 2015 02:49
-
-
Save greycode/5538624 to your computer and use it in GitHub Desktop.
简单的AJAX调用封装,传入参数仿jQuery.ajax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** | |
* 简单的异步调用封装,传入参数仿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