location 介绍
- 在浏览器中,使用
location对象可以获取当前窗口中加载的文档的路径信息。 location对象既是window对象的属性,也是document对象的属性,也就是说,window.location === document.location为真。location对象还将 URL 解析为独立的片段,让开发人员可以通过不同的属性访问这些片段。
| 属性 | 例子 | 说明 |
|---|---|---|
| hash | #content | 返回 URL 中的 hash,即为 # 号后跟零或多个字符。若 # 号后没有字符,则为空字符串。 |
| host | gzlaoben.xyz:10000 | 返回服务器名称和端口号(如果有) |
| hostname | gzlaoben:xyz | 返回不带端口号的服务器名称 |
| href | http://gzlaoben.xyz | 返回当前加载页面的完整 URL。即为 location.toString() 方法返回的值 |
| pathname | /id/14 | 返回 URL 中的目录和(或)文件名 |
| port | 8080 | 返回 URL 中指定的端口号 |
| protocol | https: | 返回页面使用的协议 |
| search | ?name=ben | 返回 URL 的查询字符串。若 ? 号后没有字符,则返回空字符串。 |
查询字符串参数
location.search 虽然可以返回从 ? 号到 URL 末尾的所有内容,但却没有办法逐个访问其中的每个查询字符串参数。为此,我们可以像下面这样创建一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象。
function getQueryStringArgs() {
// 取得查询字符串并去掉开头的问号
let queryStr = location.search.length > 0 ? location.search.substring(1) : ''
// 使用 & 号分隔符获取每一项参数键值对
let queryArr = queryStr.length ? queryStr.split("&") : []
// 保存参数对象
let params = {}
for (let itemStr of queryArr) {
let item = itemStr.split('=')
let name = decodeURIComponent(item[0])
let value = decodeURIComponent(item[1] || '')
if (name.length) {
params[name] = value
}
}
return params
}
- 在分析键值对的时候要注意两种以下的异常:
- 两个 & 号之间没有字符:
?&& - 没有键名:
?=xxx - 没有值:
?xxx=或?xxx&a=b
- 两个 & 号之间没有字符:
- 为了防止键值中出现
#&/等 URL 关键字符,因此getQueryStringArgs方法是现将键值对提取出来,再使用decodeURIComponent方法进行 URI 解码。decodeURIComponent和encodeURIComponent方法可以对;,/?:@&=+$等 URI 保留字符进行解码和编码。decodeURI和encodeURI方法则对除了 URI 保留字符外的需要进行编码的字符进行解码和编码。- URI 工具函数在设计时应当考虑到最大兼容性。因此在拼接键值对前就使用
encodeURIComponent方法分别对键值编码;在获取键值对参数时,应当拆分location.search并排除已有的 URI 保留字符后在对键值分别使用decodeURIComponent方法解码。
位置操作
非覆盖跳转
- 可使用
location.assign(url) - 直接修改
location.href或location - 可使用
open(url, '_self')以上方式都可以立即打开新的 URL 并在浏览器的历史记录中生成一条记录。 此外,可以针对性地修改location对象的其他属性,也可以改变当前加载的页面(修改hash不会重载页面,但是会新增一条历史记录)。
覆盖跳转
使用 location.replace(url) 方法可以让用户不能回退到上一个页面,并且会覆盖掉当前的这条历史记录。
重新加载页面
可使用 location.reload() 方法重新加载页面。
这个方法接收一个参数:如果传入 true 则浏览器会强制从服务器重新加载;否则浏览器会尝试从缓存中重新加载。