关于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的浏览器提供兼容支持,也是无奈之举。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 很实用的编程英语词库,共收录一千五百余条词汇。 第一部分: application 应用程式 应用、应用程序app...
    春天的蜜蜂阅读 5,427评论 0 22
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,786评论 2 45
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 6,404评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,711评论 25 709
  • 文采有限,只想简简单单的记录每天的心情。
    只是不明白而已阅读 1,301评论 1 0

友情链接更多精彩内容