|
|
/**
|
|
|
* MUI JSONP
|
|
|
* varstion 1.0.0
|
|
|
* by Houfeng
|
|
|
* Houfeng@DCloud.io
|
|
|
*/
|
|
|
|
|
|
(function($, win, doc) {
|
|
|
|
|
|
var callbackIndex = 0;
|
|
|
|
|
|
//生成回调函数名
|
|
|
var createCallbackName = function() {
|
|
|
return 'mui_jsonp_callback_' + (callbackIndex++);
|
|
|
};
|
|
|
|
|
|
var container = doc.body;
|
|
|
|
|
|
//导入 script 元素
|
|
|
var importScript = function(url) {
|
|
|
var element = doc.createElement('script');
|
|
|
element.src = url;
|
|
|
element.async = true;
|
|
|
element.defer = true;
|
|
|
container.appendChild(element);
|
|
|
return element;
|
|
|
};
|
|
|
|
|
|
//转换 URL,JSONP 只支持 get 方式的 queryString ,需将 data 拼入 url
|
|
|
var convertUrl = function(url, data, jsonpParam, callbacnName) {
|
|
|
if (jsonpParam) {
|
|
|
url = url.replace(jsonpParam + '=?', jsonpParam + '=' + callbacnName);
|
|
|
} else {
|
|
|
data['callback'] = callbacnName;
|
|
|
}
|
|
|
var buffer = [];
|
|
|
for (var key in data) {
|
|
|
buffer.push(key + '=' + encodeURIComponent(data[key]));
|
|
|
}
|
|
|
return url + (url.indexOf('?') > -1 ? '&' : '?') + buffer.join('&');
|
|
|
};
|
|
|
|
|
|
//获取 QueryString
|
|
|
var getQueryString = function(url) {
|
|
|
url = url || location.search;
|
|
|
var splitIndex = url.indexOf('?');
|
|
|
var queryString = url.substr(splitIndex + 1);
|
|
|
var paramArray = queryString.split('&');
|
|
|
var result = {};
|
|
|
for (var i in paramArray) {
|
|
|
var params = paramArray[i].split('=');
|
|
|
result[params[0]] = params[1];
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
//获取将传递给服务器的回调函数的请求参数名
|
|
|
var getJSONPParam = function(url) {
|
|
|
var query = getQueryString(url);
|
|
|
for (var name in query) {
|
|
|
if (query[name] === '?') {
|
|
|
return name;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* @description JSONP 方法
|
|
|
* @param {String} url 将请求的地址
|
|
|
* @param {Object} data 请求参数数据
|
|
|
* @param {Function} callback 请求完成时回调函数
|
|
|
* @return {mui} mui 对象自身
|
|
|
**/
|
|
|
$.getJSONP = function(url, data, callback) {
|
|
|
if (!url) {
|
|
|
throw "mui.getJSONP URL error!";
|
|
|
}
|
|
|
var jsonpParam = getJSONPParam(url);
|
|
|
var callbackName = createCallbackName();
|
|
|
data = data || {};
|
|
|
callback = callback || $.noop;
|
|
|
url = convertUrl(url, data, jsonpParam, callbackName);
|
|
|
var scriptElement = null;
|
|
|
win[callbackName] = function(result) {
|
|
|
callback(result);
|
|
|
if (scriptElement) {
|
|
|
container.removeChild(scriptElement);
|
|
|
}
|
|
|
win[callbackName] = null;
|
|
|
delete win[callbackName];
|
|
|
};
|
|
|
scriptElement = importScript(url);
|
|
|
return $;
|
|
|
};
|
|
|
|
|
|
//为原 mui.getJSON 方法添加同 jQuery.getJSON 一样的 JSONP 支持
|
|
|
$.__getJSON = $.getJSON;
|
|
|
$.getJSON = function(url, data, callback) {
|
|
|
var isJSONP = getJSONPParam(url) != null;
|
|
|
if (isJSONP) {
|
|
|
return $.getJSONP(url, data, callback);
|
|
|
} else {
|
|
|
return $.__getJSON(url, data, callback);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
}(mui, window, document)); |