网址里井号后面那一段,是给浏览器自己看的:它不会跟着请求发给服务器,只告诉浏览器该跳到页面里的哪个位置。
第 3 期讲过,网址由协议、域名、路径等部分组成。问号后面那段是查询参数,会一起发给服务器;井号后面的部分不同,它叫片段标识,浏览器在把请求发出去之前就把它去掉了。
所以服务器根本不知道你带了井号。它收到的只是井号之前的部分,返回整个页面;随后浏览器在本地找到页面上对应的位置,滚过去。这就是很多教程里"跳到第几节"的做法:每个小节有一个编号,链接末尾加井号和编号,点开直接定位。
这也解释了另一个现象:只改井号后面的内容,页面不会重新加载。当网址里只有片段变化时,浏览器认为页面没换,只是位置变了。单页应用早期就利用这一点,用井号来表示当前在哪个界面。
现在这种做法用得少了,因为浏览器提供了不刷新页面也能改地址的接口,地址里不必再带井号。但有一种用法是新的:在链接末尾加上井号和一段特殊写法的文字,可以让浏览器打开页面后直接高亮并跳到那段文字所在的位置,不用页面作者提前埋好锚点。
第 152 期讲过的问号参数和这里的井号片段,一个发给服务器、一个留在浏览器,是网址里最容易被混为一谈的两段。