window.location 的属性
本文通过一个示例 url,讲述window.location
的各个属性。假设该url如下:1
https://www.baidu.com/s?wd=location.hash&rsv_spt=1&rsv_iqid=0xa78ca3100003b820&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=6decUG6FR%2BbaSb%2FPMsTCZmiKd2aU05OANFzmoTyRD5hNNitxtu1jTmnpxMiD1NK6nql%2F&oq=location.hash&inputT=6&rsv_sug3=9&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_pq=a80d243900049765&rsv_sug4=190534#imhere
当我们访问这个网页的时候,在控制台运行以下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 控制台中输入以下代码:
JSON.stringify(window.location);
/* 可以获得以下字符串(为方便查看,手动缩进规范处理了下)
"{
"href":"https://www.baidu.com/s?wd=location.hash&rsv_spt=1&rsv_iqid=0xa78ca3100003b820&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=6decUG6FR%2BbaSb%2FPMsTCZmiKd2aU05OANFzmoTyRD5hNNitxtu1jTmnpxMiD1NK6nql%2F&oq=location.hash&inputT=6&rsv_sug3=9&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_pq=a80d243900049765&rsv_sug4=190534#imhere",
"ancestorOrigins":{},
"origin":"https://www.baidu.com",
"protocol":"https:",
"host":"www.baidu.com",
"hostname":"www.baidu.com",
"port":"",
"pathname":"/s",
"search":"?wd=location.hash&rsv_spt=1&rsv_iqid=0xa78ca3100003b820&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=6decUG6FR%2BbaSb%2FPMsTCZmiKd2aU05OANFzmoTyRD5hNNitxtu1jTmnpxMiD1NK6nql%2F&oq=location.hash&inputT=6&rsv_sug3=9&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_pq=a80d243900049765&rsv_sug4=190534",
"hash":"#imhere"
}"
*/
由上可得 window.location 的10个属性:
href / ancestorOrigins / origin / protocol / host
hostname / port / pathname / search / hash
- window.location.href
整个URl字符串(在浏览器中就是完整的地址栏)
本例返回值: https://www.baidu.com/s?wd=location.hash&rsv_spt=1&rsv_iqid=0xa78ca3100003b820&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=6decUG6FR%2BbaSb%2FPMsTCZmiKd2aU05OANFzmoTyRD5hNNitxtu1jTmnpxMiD1NK6nql%2F&oq=location.hash&inputT=6&rsv_sug3=9&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_pq=a80d243900049765&rsv_sug4=190534 - window.location.protocol
URL 的协议部分
本例返回值: https: - window.location.host
URL 的主机部分
本例返回值: www.baidu.com - window.location.hostname
URL 的主机部分,在这里 window.location.hostname === window.location.host
本例返回值: www.baidu.com - window.location.port
URL 的端口部分
如果采用默认的80端口(即使添加了:80),那么返回值并不是默认的80而是空字符
本例返回值: “” - window.location.pathname
URL 的路径部分(就是文件地址)
本例返回值: /s - window.location.search
查询(参数)部分
除了给动态语言赋值以外,我们同样可以给静态页面,并使用javascript来获得相信应的参数值
本例返回值: ?wd=location.hash&rsv_spt=1&rsv_iqid=0xa78ca3100003b820&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_t=6decUG6FR%2BbaSb%2FPMsTCZmiKd2aU05OANFzmoTyRD5hNNitxtu1jTmnpxMiD1NK6nql%2F&oq=location.hash&inputT=6&rsv_sug3=9&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_pq=a80d243900049765&rsv_sug4=190534 - window.location.hash
锚点
本例返回值: #imhere
window.location 改变当前页面 url 的方法
- window.location = ‘xxx’;
- location = ‘xxx’;
- window.location.href = ‘xxx’;
- location.href = ‘xxx’;
- window.replace(‘xxx’);
这五种方法都会让浏览器的历史记录里面多一项,但是有一个较大的区别就是前四种方法依然可以通过使用浏览器的“前进”和“后退”按钮回到替换url之前的原始url,但是对于最后一种方法 window.replace(url),则将失去浏览器的“前进”和“后退”按钮功能,因为该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过“前进”和“后退”来访问已经被替换的URL。
window.location.reload([bForceGet])
window.location.reload([bForceGet])方法接收一个参数,默认为false,即刷新当前页面并如果有缓存的话就从缓存里面读取页面。当传入这个方法的参数为true时,则表示强刷页面,效果与用户直接 Ctrl + F5 的效果是一样的,即直接从服务器获取最新的页面。
使用 window.location.hash 欺骗浏览器
有这么一个场景,就是在一个页面里面,浏览到了你想收藏的地方,这时候你收藏了链接,下次再打开的时候,却发现还是要从头开始找那个你想收藏的地方。但是,使用 window.location.hash 可以解决这个问题。
解决方法就是给链接加上一个hash
值,每次打开链接的时候使用js去获取这个hash
值,并根据不同的hash
值显示不同的页面。这样,还可以欺骗浏览器,让浏览器以为加了hash
的链接是一个新的页面,这样就可以充分使用浏览器的“前进”和“后退”功能了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 示意代码
window.onload = function () {
var hash = window.location.hash;
switch (hash) {
case 'part1':
showPart1();
break;
case 'part2':
showPart2();
break;
case '':
showPart0();
break;
default:
showPart0();
break;
}
};
注意
window.location === document.location 在没有使用 iframe 时,结果为 true,即两者没有什么区别,但是一旦页面中使用了 iframe 框架,就会有不同了,在 iframe 中的 window.location 等同于 top.location,但是不一定与 document.location 等同。
总结
合理利用window.location
可以实现很多有趣的功能,比如在 a 标签中使用 href=”#” 可以实现快速回到页面顶部。