js拆分url,网上一搜有很多。但是为什么要写这篇文章呢。他们都有固定的缺点, 不支持多个?传参
例如:http://www.baidu.com/?name=9700&direct=http://www.sohu.com/?id=9700
我们可以分析一下URL都有几种特点
- history模式(不带#,http://www.baidu.com/)
- hash模式(带#,http://www.baidu.com/#/)
- 跳转URl不带参数(http://www.baidu.com/)
- 跳转URL带参数(http://www.baidu.com/?name=9700)
- 目标URL不带参数(http://www.baidu.com/?direct=http://www.sohu.com/)
- 目标URL带参数(http://www.baidu.com/?direct=http://www.sohu.com/?id=9700)
function UrlSplit(url){
if(url.split("?") && url.split("?")[1]){
var rsUrl = url.split("?");
rsUrl.shift()
var rs = rsUrl.join("?")
if(rsUrl.length>1){
var rs2 = rs.split("?")
var arr=rs2[1].split("&");
if(rs2[0].indexOf("&") == -1){
arr.push(rs2[0])
}else{
arr = arr.concat(rs2[0].split("&"))
}
}else{
var rs2 = unescape(rs).split("?")
if(rs2.length == 1){
var arr=rs2[0].split("&");
arr.push(rs2[0])
}else{
var arr=rs2[1].split("&");
arr.push(rs2[0])
}
}
var json={};
for(var i=arr.length-1;i>=0;i--){
if(arr[i].indexOf("=")!=-1){
json[arr[i].split("=")[0]]=arr[i].split("=")[1];
}
else{
json[arr[i]]="undefined";
}
}
return json
}
return null
}
我们测试一下
- history模式(不带#,http://www.baidu.com/)
UrlSplit('http://www.baidu.com/')
结果:null
- hash模式(带#,http://www.baidu.com/#/)
UrlSplit('http://www.baidu.com/#/')
结果:null
- 跳转URl不带参数(http://www.baidu.com/)
UrlSplit('http://www.baidu.com/')
结果:null
- 跳转URL带参数(http://www.baidu.com/?name=9700)
UrlSplit('http://www.baidu.com/?name=9700')
结果:{name:'9700'}
UrlSplit('http://www.baidu.com/?direct=http://www.sohu.com/')
结果:{direct:'http://www.sohu.com/'}
UrlSplit('http://www.baidu.com/?direct=http://www.sohu.com/?id=9700')
结果:{direct:'http://www.sohu.com/',id:'9700'}
终极测试复杂URL
案例一
UrlSplit('http://www.baidu.com/?names=百度&direct=http://www.sohu.com/?id=9700&name=九千七')
结果:{direct:'http://www.sohu.com/',names:'百度',name:'九千七',id:'9700'}
案例二
UrlSplit('http://www.baidu.com/#/?names=百度&direct=http://www.sohu.com/#/?id=9700&name=九千七')
结果:{direct:'http://www.sohu.com/#/',names:'百度',name:'九千七',id:'9700'}
完美解决所有类型,喜欢的可以收藏。代码没有注释,写的比较烂。因为我只是一个前端弟弟。