文章目录
  1. 1. window 对象
    1. 1.1. 窗口位置
    2. 1.2. 窗口大小
    3. 1.3. 导航和打开窗口
      1. 1.3.1. 弹出窗口
      2. 1.3.2. 弹出窗口屏蔽程序
    4. 1.4. 间歇调用和超时调用
    5. 1.5. 系统对话框
  2. 2. location 对象
    1. 2.1. 查询字符串参数
    2. 2.2. 位置操作

window 对象

窗口位置

款浏览器取得窗口左边和上边的位置。

1
2
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenY;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenX;

移动到新位置

1
2
3
4
5
//将窗口移动到屏幕左上角
window.moveTo(0,0);
//将窗口向下移动到100像素
window.moveBy(0,100);

窗口大小

取得页面视口的大小

1
2
3
4
5
6
7
8
9
10
11
12
var pageWidth = window.innerWidth,
pageHeight = window.innerHeight;
if (typeof pageWidth != "number") {
if (document.compatMode == "CSS1Compat") {
pageWidth = document.documentElement.clientWidth;
pageHeight = document.documentElement.pageHeight;
} else {
pageWidth = document.body.clientWidth;
pageHeight = document.body.pageHeight;
}
}

调整浏览器窗口的大小

1
2
3
4
5
//调整到 100 x 100
window.resizeTo(100, 100);
//调整到200 x 150
window.resizeTo(100, 50);

导航和打开窗口

弹出窗口

设置: height|left|location|menubar|resizable|scrollbars|status|toolbar|top|width|

1
window.open("http://www.google.com", "wroxWindow", "height=400,width=400,top=10,left=10,resizable=yes");

调用 close() 方法还可以关闭新打开的窗口。

1
2
wroxWin.close();
alert(wroxWin.closed); //true
弹出窗口屏蔽程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var blocked = false;
try {
var wroxWin = window.open("http:www.google.com"", "_blank");
if (wroxWin == null) {
blocked = true;
}
} catch (ex) {
blocked = true;
}
if (blocked) {
alert("The popup was blocked!");
}

间歇调用和超时调用

1
2
3
4
5
6
7
//不建议传递字符串
setTimeout ("alert('hello world')", 1000);
//推荐的调用方式
setTimeout(function(){
alert('hello world');
}, 1000);

虽然这两种调用方式都没有问题,但由于传递字符串可能导致性能损失,因此不建议以字符串作为第一个参数。
第二个参数是一个表示等待多长时间的毫秒数,但经过该时间后指定的代码不一定会执行。JavaScript 是一个单线程的解释器,因此一定时间内只能执行一段代码。为了要控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。setTimout()的第二个参数告诉 JavaScript 再过多长时间把当前任务到队列中。如果队列是空的,那么添加的代码回立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行。

超时调用的代码都是在全局作用域总执行的,因此函数中 this 的值在非严格模式下指向 window 对象,在严格模式下是 undefined。

间歇调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var num 0;
var max = 10;
var intervalId = null;
function incrementNumber() {
num++;
//如果执行次数达到max设定的值,则取消后续尚未执行的调用
if (num == max) {
clearInterval(intervalId);
alert("Done");
}
},
intervalId = setInterval(incrementNumber, 500);

这个模式也可以使用超时调用来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var num 0;
var max = 10;
var intervalId = null;
function incrementNumber() {
num++;
//如果执行次数未达到max设定的值,则设置另一次超时调用
if (num < max) {
setTimout(incrementNumber, 500);
} else {
alert("Done");
}
}
setTimeout(incrementNumber, 500);

可见,在使用超时调用时,没有必要跟踪超时调用 ID,因为每次执行代码后,如果不在设置另一次超时调用,调用就会自行停止。一般认为,使用超时调用来模拟间歇调用的是一种最佳模式。在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用有可能在前一个间歇调用结束之前启用。而像前面实例中那样使用超时调用,则完全可以避免这一点。所以最好不要使用间歇调用。

系统对话框

确认对话框的典型用法如下。

1
2
3
4
5
if (confirm("Are you sure?")) {
alert("I'm so glad you're sure!");
} else {
alert("I'm sorry to hear you're not sure.");
}

调用 promet()。

1
2
3
4
var result = prompt("What is your name?", "");
if (result !== null) {
alert("Welcome, " + result);
}

其它

1
2
3
4
5
//显示"打印"对话框
window.print();
//显示"查找"对话框
window.find();

location 对象

属性名: hash|host|hostname|href|pathname|port|protocol|search

查询字符串参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}

位置操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//下列三行代码的效果完全一样
location.assign("http://www.google.com");
window.location("http://www.google.com");
location.href("http://www.google.com");
//设置新值来改变URL
//假设初始URL为 http://www.google.com/WileyCDA/
//将URL修改为"http://www.google.com/WileyCDA/#section1"
location.hash = "#section1";
//将URL修改为"http://www.google.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/WileyCDA"
location.port = 8080;

没修改 location 的属性(hash除外),页面都会以新URL重新加载

当通过上述任何一种方式修改 URL 之后,浏览器的历史纪录中就会生成一条新纪录,因此用户通过单击”后退”按钮都会导航到前一个页面。要禁用这种行为,可以使用 replace() 方法。

1
location.replace("http://www.google.com");
文章目录
  1. 1. window 对象
    1. 1.1. 窗口位置
    2. 1.2. 窗口大小
    3. 1.3. 导航和打开窗口
      1. 1.3.1. 弹出窗口
      2. 1.3.2. 弹出窗口屏蔽程序
    4. 1.4. 间歇调用和超时调用
    5. 1.5. 系统对话框
  2. 2. location 对象
    1. 2.1. 查询字符串参数
    2. 2.2. 位置操作