You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 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;
};
//转换 URLJSONP 只支持 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));