8.2 location对象
location是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。
location是一个特别的对象,它既是window对象的一个属性,又是document对象的一个属性;换句话说,window.location和document.location引用的是同一个对象。location对象的用处不只表现在它保存着当前文档的信息,还表现在它将URL解析为独立的片段,让开发人员可以通过 不同的属性访问这些片段。
1. 查询字符串参数
虽然上面的属性可以访问到location对象的大多数信息,但其中访问URL包含的查询字符串的属性并不方便。尽管location.search返回从问号到URL末尾的所有内容,但却没办法逐个访问其中的每个查询字符串参数。为此,可以创建下面这样一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function getQueryStringArgs(){
//取得查询字符串并去掉开头的问号
var qs = (location.search.length > 0 ? location.search.substring(1) : ''),
//保存数据的对象
args = {};
//取得每一项
items = qs.length ? qs.split('&') : [];
item = null,
name = null,
value = null,
//在for循环中使用
i = 0,
len = items.length;
//逐个将每一项添加到args对象中
for(i = 0; i < len; i++) {
item = items[i].split('=');
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if(name.length) {
args[name] = value;
}
}
return args;
}
//假设查询字符串是?q=javascript&num=10
var args = getQueryStringArgs();
console.info(args['q']); //'javascript'
console.info(args['num']); //'10'
每个查询字符串都成了返回对象的属性。这样就极大方便了对每个参数的访问。
2. 位置操作
使用location对象可以通过很多方式来改变浏览器的位置。首先,也是最常用的方法,就是使用assign()方法并为其传递一个URL,如下所示:
1
2
//##skipEval
location.assign('http://halomaple.com/8.2-LocationObject')
这样,就可以立即打开URL并在浏览器的历史记录中生成一条记录。如果是将location.href或者window.location设置为一个URL,也会以该值调用assign()方法。下列代码效果一样:
1
2
3
//##skipEval
window.location = 'http://halomaple.com/8.2-LocationObject';
location.href = 'http://halomaple.com/8.2-LocationObject';
这些方法中最常用的是设置location.href属性的值。
另外,修改location对象的其他属性也可以改变当前加载的页面。下面的例子展示通过将hash、search、hostname、pathname和port属性设置为新值来改变URL。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//##skipEval
//假设初始URL为http://www.wrox.com/WileyCDA
//将URL修改为http://www.wrox.com/WileyCDA/#section1
location.hash = '#section1';
//将URL修改为http://www.wrox.com/WileyCDA/?q=javascript
location.search = '?q=javascript';
//将URL修改为http://www.yahoo.com/WileyCDA/
location.hostname = 'www.yahoo.com';
//将URL修改为http://www.yahoo.com/mydir/
location.pathname = 'mydir';
//将URL修改为http://www.yahoo.com:8080/mydir/
location.port = 8080;
每次修改location属性(hash除外),页面都会以新URL重新加载。
在IE8、Firefox1、Safari2+、Opera9+和Chrome中,修改hash的值会在在浏览器的历史记录中生成一条新记录。在IE早期版本中,hash属性不会在用户单击“后退”和“前进”按钮时被更新,而只会在用户单击包含hash的URL时才会被更新。
当通过上述任何一种方式修改URL后,浏览器的历史记录中就会生成一条新记录,因此用户通过单击“后退”按钮都会导航到前一个页面。要禁用这种行为,可以使用replace()方法。这个方法只接受一个参数:要导航到的URL;结果虽然会导致浏览器位置改变,但不会在历史记录中生成新记录。在调用replace()方法之后,用户不能回到前一个页面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>You won't be able to get back here</title>
</head>
<body>
<p>Enjoy this page for a second, because you won't be able to coming back here.</p>
<script type="text/javascript">
setTimeout(function () {
location.replace('http://www.wrox.com/');
} ,1000);
</script>
</body>
</html>
与位置有关的最后一个方法是reload(),作用是重新加载当前显示的页面。如果调用reload()时不传递任何参数,页面就会以最有效的方式重新加载。也就是说,如果页面自上次请求以来没有改变过,页面就会从浏览器缓存中重新加载。如果要强制从服务器重新加载,需要加参数:true
1
2
3
4
//##skipEval
location.reload(); //重新加载(有可能从缓存中加载)
location.reload(true); //重新加载(从服务器重新加载)
位于reload()调用之后的代码可能会也可能不会执行,取决于网络延迟或系统资源等因素。因此,最好将reload()放在代码的最后一行。
【本文内容摘自:《JavaScript高级程序设计》(第3版)Nicholas C.Zakas 著 李松峰 曹力 译】