关于location.search与location.hash

首先看一下使用正则表达式获取地址栏参数的方法

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;
}

这个函数是没有问题的。但测试时发现,对下面这个URL不能正确获取参数:
https://www.google.com.hk/?ion=1&espv=2#newwindow=1&safe=strict&q=regexp%E5%8F%AF%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA

这个URL的参数应该有4个,分别是ion、espv、safe和q,但是我在chrome的console下输入window.location.search得到的结果却是

Paste_Image.png

明显少了两个。百思不得其解。

纠错

刚刚在segmentfault上找到了一些解释,根据W3C的规定,在URL中fragment一定是在query之后的。(更详细的可以看上一篇文章【地址栏参数详解】)。

  • query的规定是以第一个?开始,至行尾或#结束。
  • fragment以#为开始,行尾为结束。

另外根据query和fragment字符限定的规定,两者中都可以含有/和?,但不可以含有#。(还有其它的限制,这里是简要的说法,因为我们此处要讨论以?和#开头的字串)

所以上面的URL中:
query就是?ion=1&espv=2;
fragment就是#newwindow=1&safe=strict&q=regexp%E5%8F%AF%E5%8C%85%E5%90%AB%E5%A4%9A%E4%B8%AA。

特殊情况

在使用Angular或者Vuejs构建单页应用时,我们可能会遇到这样的URL:
http://localhost:8080/#!/account?id=123

根据前面的解释,上面的URL以及Angular.js中出现的http://example.com/#/some/path?search=a#hash形式的URL实际上是不符合RFC规定的。
对URL在#之后的部分做变动不会刷新页面,你可以在浏览器的console里分别输入window.location.hash="#hash"和window.location.search="?sa"执行看看结果,后者是会刷新页面的。HTML5有History API可以不刷新页面对URL进行修改,就不用加一个#号来防刷新了。但是此处是为了给不支持HTML5的浏览器提供兼容支持,也是无奈之举。

你可能感兴趣的:(关于location.search与location.hash)