broadcast-message
Version:
基于postMessage+BroadcastChannel+localStorage+互信域名的前端页面数据通信解决方案
125 lines (112 loc) • 3.13 kB
text/typescript
/*!
* @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对象
*/
export interface URLParams {
[prop: string]: any
}
export interface URLObject {
source: string
protocol: string
host: string
port: string | number
origin: string
search: string
query: string
file: string
hash: string
path: string
relative: string
params: URLParams
[prop: string]: any
}
function parseURL(url: string) {
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: any = {}
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: URLParams) {
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: URLObject) {
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 }