Fork me on GitHub

window.location hash和search 掐架

发现问题的由来

首先有个需求,就是获取浏览器参数,也就是 window.location.href问号后面的参数值,就google了一个在江湖中流传的号称最好用的方法:

1
2
3
4
5
6
7
8
9
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}

// 调用方法
alert(GetQueryString("参数名1"));

设置了一个全局方法,成功了,立马各个项目用起来~

这次有个需求,在页面加载时去获取参数时发现怎么都获取不到,于是去看代码,发现用到了window.location.search,调试发现window.location.search是空字符串。

科普window.location

这段内容是W3C上找的,高手请跳过~

Location 对象

Location 对象包含有关当前 URL 的信息。

Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问。

定位问题

search:设置或返回从问号 (?) 开始的 URL(查询部分)。
感觉没问题啊,可是为什么window.location.search是空字符串?

请看下图调试结果:

?id=1出现在了hash中,而没有出现在search中,汗!!!

找到答案

继续google,在stackoverflow找到了解答:

window.location在解析url时,#后面的全都识别成了hash;

个人猜测url解析时,即使遇到?,后面也会去解析#;

相反,如解析时遇到#,后面却不会再去解析? 得找个相关的资料看下了~

一句话,慎用#,慎用#,慎用#,重要的话说三遍!

最后修改了获取浏览器参数的方法:

1
2
3
4
5
6
7
8
9
10
11
function GetQueryString(name)
{
var search = window.location.search;
if(!search){
var hash = location.hash;
search = hash?hash.substring(hash.indexOf('?')):'';
}
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}

另外,根据我们的项目特征,可以把参数设置放在#之前
比如:

1
http://taeyxbak1.superboss.cc/index.html?id=18511#/zx/zdy/

当然这个场景设定在我们的框架初始化之前就要拿url参数,如果是框架初始化之后,那么可以用我们框架的方法,相应方法可以在pages里面找到~

坚持原创技术分享,您的支持将鼓励我继续创作!