Appearance
用途: 1.页面跳转传参(根据参数的不同,获取不同的信息进行呈现) 2.ajax向服务器发请求,基于url参数传递给服务器不同的数据,从而获取不同的结果 3.vue-router/react-router-dom路由跳转中,基于问号传参.实现路由之间信息的传递
js
// 无法处理缺失#/?/#&?的情况或#在?前的情况
function queryUrlParams (url, param) {
// 1.获取?和#后面的值
let askIndex = url.indexOf('?'),
polIndex = url.lastIndexOf('#')
let askText = url.substring(askIndex + 1, polIndex),
polText = url.substring(polIndex + 1)
// 2.解析并拼接成对象
const obj = {}
// 处理#后面的值
polText.length > 0 ? obj.hash = polText : null
// 处理?后面的值
let arr
if (askText) {
askText.split('&').forEach(item => {
arr = item.split('=')
obj[arr[0]] = arr[1]
})
}
return param === undefined ? obj : obj[param]
}js
// 能处理缺失#/?/#&?/#在?前面的情况
function queryUrlParams (url, param) {
let askIndex = url.indexOf('?'),
polIndex = url.lastIndexOf('#')
askText = '',
polText = ''
if (askIndex > -1 && polIndex === -1) {
// 如果#不存在,但是?存在: hash不处理,问号参数值为问号后一项到末尾
askText = url.substring(askIndex + 1)
} else if (askIndex === -1 && polIndex > -1) {
// 如果?不存在,但是#存在: 问号参数不处理,hash值为#后一项到末尾
polText = url.substring(polIndex + 1)
} else if (askIndex > -1 && polIndex > -1) {
// 如果#&?都存在
if (askIndex > polIndex) {
// #在?前面: 问号参数为?后一项到末尾 hash值为#后一项到?前一项
askText = url.substring(askIndex + 1)
polText = url.substring(polIndex + 1, askIndex)
} else {
// #在?后面: 问号参数为?后一项到#号前一项 hash值为#后一项到末尾
askText = url.substring(askIndex + 1, polIndex)
polText = url.substring(polIndex + 1)
}
}
// 如果#&?都不存在: 无需处理
const obj = {}
polText.length > 0 ? obj.hash = polText : null
let arr
if (askText) {
askText.split('&').forEach(item => {
arr = item.split('=')
obj[arr[0]] = arr[1]
})
}
return param === undefined ? obj : obj[param]
}js
function queryUrlParams (url, param) {
// 在js中获取的a元素对象包含了很多内置属性,存储对href地址的解析
// 但是无法处理#在?之前的情况,正常url中#都要在?之后,但在vue/react路由中可以把#放到?前
// search: '?id=1&name=foo'
// hash: '#video'
// host: 'www.baidu.com'
// ...
// 1.创建a标签,获取问好参数和hash值
let link = document.createElement('a')
link.href = url
let askText = link.search.substring(1),
polText = link.hash.substr(1),
obj = {}
link = null
// 2.向对象中存储
polText ? obj.hash = polText : null
// if (askText) {
// let arr = askText.split(/(?:&|=)/g) // ['id', '1', 'name', 'foo', 'from', 'wx'] 同时按?和#来拆
// for (let i = 0; i < arr.length; i+=2) {
// obj[arr[i]] = arr[i + 1]
// }
// }
// 基于ES6新增的URLSearchParmams实现问好参数的解析
// askText为''也不会报错,只是就不执行forEach
new URLSearchParams(askText).forEach((value, key) => obj[key] = value)
return param === undefined ? obj : obj[param]
}js
// queryUrlParams: 获取url问号参数和hash
// @params
// param: [string] 查询的参数
// @return
// [object] 由参数和值组成的对象
function queryUrlParams (param) {
let obj = {}
this.replace(/([^?=&#]+)=([^?=&#]+)/g, (...[, $1, $2]) => {
obj[$1] = $2
})
this.replace(/#([^?=&#]+)/g, (...[, $1]) => {
obj['hash'] = $1
})
return param === undefined ? obj : obj[param]
}