2018-08-23 从Vue-Router的Hash说起的URL相关知识

最近被问到VueRouter的两种模式的区别,答:Hash模式url上有#号,History模式url上没有#。完!
也不知道这么回答对不对,就看了看资料,发现也就是这个意思吧!

Vue-Router中有两种URL模式,一个是Hash(默认),一个是History模式。

const router = new VueRouter({
  mode: 'history', 
  routes: [{...}]
})

History模式需要后台设置,具体设置请看文档

说说这个#的是什么

1. #的含义

#(Hash)代表网页中的一个位置,右边就是该位置的标识符,2010年twitter第一次将#用到URL中,(这是主流网站第一次大规模的使用),比如:http://www.example.com/index.html#print 就代表网页中index.html的print位置。浏览器读取这个URL后会自动将页面滚动到print这个标识符的位置,在html中指定标识符的方法有两种:
1.使用锚点 <a name="print"></a>
2.使用id属性<div id="print"></div>

2. http请求完全忽略 #

#是用来指示浏览器的动作,对服务器完全无用,所以http请求中没有#,比如访http://www.example.com/index.html#print

GET index.html HTTP/1.1
Host: www.example.com  //#print完全被忽略

由于请求将#后的字符完全忽略,但是可以将#转义为%23
例如:http://www.example.com/index.html?color=#fff 改为 http://www.example.com/index.html?color=%23fff

GET index.html?color
GET index.html?color=#fff //转义后
Host: www.example.com

3. 修改#后面的url不会触发网页加载

比如:http://www.example.com/index.html#location1 改为 http://www.example.com/index.html#lcoation2
浏览器不会发起任何请求。

4. 但是改变#会改变浏览器的访问历史

每改变一次#后面的,都会在浏览器的访问历史中增加一个记录,使用倒退按钮可以返回,前进等。这对于Ajax应用程序特别有用,
用不同的#值,代表不同的访问状态,对ie6/7没用,他们不会应为#后的变化而增加历史记录。

5. window.location.hash读取#值

window.location.hash 的值可读可写,读取来判断状态是否改变,写入时可以在不重载网页的前提下,添加一条历史访问记录。

6. onhashchange事件

onhashchange是一个HTML5新增的事件,hash变化时就会触发这个事件
三种事件监听方式:

window.onhashchange = foo
<div onhashchange="foo()">
window.addEventlistener('hashchange',foo,false)

不支持该事件的浏览器可以用setInterval监控location.hash的变化

7. google抓取#的机制

默认情况下google爬虫会忽略URL的#部分,但是如果你希望,Ajax生成的内容可以被爬虫读取,name可以使用#!
google会自动将后面的内容转化成查询字符串_escaped_fragment_的值,即#!?_escaped_fragment_=替换

http://twitter.com/#!/username //转化为
http://twitter.com/?_escaped_fragment_=/username

总结

对URL中的# (Hash)对照阮一峰老师的博客 做了个简单总结,后期要对history等关键知识进行一下总结,先插个旗。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前端开发者丨http请求 https:www.rokub.com 前言见解有限, 如有描述不当之处, 请帮忙指出,...
    麋鹿_720a阅读 11,004评论 11 31
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,997评论 19 139
  • 写一写今天一点感悟吧。 做朋友到底怎么样才算真心对待呢?难道要一昧去附和对方,赞同她的话,同意她的观点,让...
    Fosia阅读 546评论 0 2
  • 一丶简单用法 布局文件中增加 ListView 源码中准备数据 源码中构造适配器 Adapter 通过 id 找到...
    青见仔阅读 27,504评论 0 2
  • 从未在这一刻如此的想你,明明我们从未开始,明明一开始从未对你记忆深刻,可是为什么你要说你记得我的全部,为什么你要告...
    慕敬言阅读 286评论 0 0