broadcast-message
Version:
基于postMessage+BroadcastChannel+localStorage+互信域名的前端页面数据通信解决方案
99 lines (98 loc) • 3.18 kB
JavaScript
/*!
* @name url.js
* @description 用于对url进行解析的相关方法
* @version 0.0.1
* @author Blaze
* @date 27/03/2019 15:52
* @github https://github.com/xxxily
*/
/**
* 参考示例:
* https://segmentfault.com/a/1190000006215495
* 注意:该方法必须依赖浏览器的DOM对象
*/
function parseURL(url) {
var a = document.createElement('a');
a.href = url || window.location.href;
return {
source: url,
protocol: a.protocol.replace(':', ''),
host: a.hostname,
port: a.port,
origin: a.origin,
search: a.search,
query: a.search,
file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1],
hash: a.hash.replace('#', ''),
path: a.pathname.replace(/^([^/])/, '/$1'),
relative: (a.href.match(/tps?:\/\/[^/]+(.+)/) || ['', ''])[1],
params: (function () {
const ret = {};
const seg = [];
var paramArr = a.search.replace(/^\?/, '').split('&');
for (var i = 0; i < paramArr.length; i++) {
var item = paramArr[i];
if (item !== '' && item.indexOf('=')) {
seg.push(item);
}
}
for (var j = 0; j < seg.length; j++) {
var param = seg[j];
var idx = param.indexOf('=');
var key = param.substring(0, idx);
var val = param.substring(idx + 1);
if (!key) {
ret[val] = null;
}
else {
ret[key] = val;
}
}
return ret;
})(),
};
}
/**
* 将params对象转换成字符串模式
* @param params {Object} - 必选 params对象
* @returns {string}
*/
function stringifyParams(params) {
var strArr = [];
if (!(Object.prototype.toString.call(params) === '[object Object]')) {
return '';
}
for (var key in params) {
if (Object.hasOwnProperty.call(params, key)) {
var val = params[key];
var valType = Object.prototype.toString.call(val);
if (val === '' || valType === '[object Undefined]')
continue;
if (val === null) {
strArr.push(key);
}
else if (valType === '[object Array]') {
strArr.push(key + '=' + val.join(','));
}
else {
val = (JSON.stringify(val) || '' + val).replace(/(^"|"$)/g, '');
strArr.push(key + '=' + val);
}
}
}
return strArr.join('&');
}
/**
* 将通过parseURL解析出来url对象重新还原成url地址
* 主要用于查询参数被动态修改后,再重组url链接
* @param obj {Object} -必选 parseURL解析出来url对象
*/
function stringifyToUrl(urlObj) {
var query = stringifyParams(urlObj.params) || '';
if (query) {
query = '?' + query;
}
var hash = urlObj.hash ? '#' + urlObj.hash : '';
return urlObj.origin + urlObj.path + query + hash;
}
export { parseURL, stringifyParams, stringifyToUrl };