BOM(浏览器对象模型)中最有用的对象之一就是 location。
Location 对象是很特别的对象,因为它既是 window 对象的属性,也是 document 对象的属性。
Location 对象包含有关当前 URL 的信息, Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问。
一、Location Hash属性
Location 对象的 hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)。
hash 哈希值。设置或返回从井号 (#) 开始到 URL结束的值。可以用它来记录页面的状态。若页面存在某个链接的 name 的值与 hash 值是一样的,页面载入时,浏览器会滚动到该链接的位置。 需要注意的是,如果URL中不带#,则 hash 值为空字符串,否则,hash值为#以及到URL结束的值。
二、#的涵义
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如:
http://up8.wang/2018/03/29/js/js-location/#print
就代表网页当前页面的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。
为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name=”print”></a>,二是使用id属性,比如<div id=”print”>。
三、HTTP请求不包括
#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。比如,访问下面的网址,
http://up8.wang/2018/03/29/js/js-location/#print
浏览器实际发出的请求是这样的:
GET http://up8.wang/2018/03/29/js/js-location/ HTTP/1.1
Host: up8.wang
可以看到,只是请求/2018/03/29/js-location/,根本没有”#print”的部分。
四、#后的字符
在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。比如,下面URL的原意是指定一个颜色值:
http://up8.wang/2018/03/29/js/js-location/?color=#fff
但是,浏览器实际发出的请求是:
GET /?color= HTTP/1.1
Host: up8.wang
可以看到,”#fff”被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:
http://up8.wang/2018/03/29/js/js-location/?color=%23fff
五、改变#不触发网页重载
单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。比如,从
http://up8.wang/2018/03/29/js/js-location/#print
改成
http://up8.wang/2018/03/29/js/js-location/#print2
浏览器不会重新向服务器请求。
六、改变#会改变浏览器的访问历史
每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置。这对于 ajax 应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。
值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。
七、window.location.hash读取#值
window.location.hash 这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。
八、onhashchange事件
这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+ 支持该事件。