第8章 BOM
window对象
- window对象既是JS访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象
全局作用域
- 所有在全局作用域中声明的变量、函数都会成为window对象的属性和方法
- 全局变量不能通过delete操作符删除,直接在window对象上的定义的属性可以。
- 尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在。
var newValue=window.oldVlue
oldValue为定义,newValue的值是undefined窗口关系及框架
- 如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中。
- top对象始终指向最高(最外)层的框架,也就是浏览器窗口
- parent对象始终指向当前框架的直接上层框架
- self对象始终指向window
- 在使用框架的情况下, 浏览器会存在多个Global对象。在每个框架中定义的全局变量会自动成为框架中window对象的属性。
- 由于每个window对象都包含原生类型的构造函数,因此每个框架都有一套自己的构造函数,这些构造函数一一对应,但并不相等。
窗口位置
- screenLeft(screenX):表示窗口相对于屏幕左边的位置
- screenTop(screenY):表示窗口相对于屏幕上边的位置
通过以下代码可以跨浏览器取得窗口左边和上边的位置
1
2var leftPos=(typeof window.screenLeft=="number")?window.screenLeft:window.screenX;
var topPos=(typeof window.screenTop=="number")?window.screenTop:window.screenY;无法在跨浏览器的条件下取得窗口左边和上边的精确坐标值
- moveTo()和moveBy()方法可以跨浏览器地将窗口精确地移动到一个新位置
- moveTo():接收新位置的x和y坐标值
- moveBy():在水平和垂直方向上移动的像素数
- moveTo()和moveBy()方法可能被浏览器禁用,且不适用于框架,只能对最外层window对象使用
窗口大小
无法确定浏览器窗口本身的大小,但是可以取得页面视口的大小
1
2
3
4
5
6
7
8
9
10
11var pageWidth=window.innerWidth;
var pageHeight=window.innerHeight;
if(typeof pageWidth!="number"){
if(document.compatMode=="CSS1Compat"){
pageWidth=document.documentElement.clientWidth;
pageHeight=document.documentElement.clientHeight;
}else{
pageWidth=document.body.clientWidth;
pageHeight=document.body.clientHeight;
}
}resizeTo()和resizeBy()方法可以调整浏览器窗口的大小
- resizeTo():接收新窗口的宽度和高度
- resizeBy():接收新窗口和原窗口的宽度与高度之差
- resizeTo()和resizeBy()方法可能被浏览器禁用,且不适用于框架,只能对最外层window对象使用
导航和打开窗口
- winodw.open():导航一个特定的url,也可以打开一个新的浏览器窗口。
- window.open()会返回一个指向新窗口的引用,可以像操作其他窗口一样操作新打开的窗口
- close()方法仅适用于通过winodw.open()打开的弹出窗口,对于浏览器的主窗口,没有得到用户的允许不能关闭。
- 新创建的window对象有一个opener属性,保存着打开它的原始窗口对象。
- 在新创建的标签页opener设置为null,表示在单独的进程中运行新标签页,不需要与打开它的标签页通信。
- 在弹出窗口被屏蔽时,就应该考虑两种可能性。
1.如果浏览器内置的屏蔽程序阻止的弹出窗口,window.open()会返回null值
1 | var wroxWin=window.open("http://www.wrox.com","_blank"); |
2.如果是浏览器扩展或其他程序阻止的弹出窗口,那么window.open通常会抛出一个错误。
1 | var blocked=false; |
间歇调用与超时调用
- setTimeout():超时调用,在指定的时间过后执行代码。返回一个代表计划执行代码的唯一标识符ID,可以用clearTimeout(ID)来取消超时调用计划。
- 超时调用的代码都是在全局作用域中执行的,函数中的this值在非严格模式下指向window对象,在严格模式下是undefiend。
- setInterval():间歇调用,按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。返回一个代表计划执行代码的唯一标识符ID,可以用clearTimeout(ID)来取消间歇调用计划。
- 一般使用超时调用来模拟间歇调用,因为间歇调用可能会在前一个间歇调用结束之前启动,最好不要使用间歇调用
1
2
3
4
5
6
7
8
9
10
11
12
var num=0;
var max=10;
function incrementNumber(){
num++;
if(num<max){
setTimeout(incrementNumber(),500);
}else{
alert("Done");
}
}
setTimeout(incrementNumber(),500);
系统对话框
- alert()、confirm()、prompt()都是同步的
- alert():只有确认按钮
confirm():确认和取消按钮
1
2
3
4
5if(confirm("1")){
alert("yes");
}else{
alert("no");
}prompt():确认和取消按钮,还有一个文本框
1
2
3
4var result=prompt("what is your name","xyy");
if(result!==null){
alert("Welcome,"+result);
}window.print() window.find()
异步显示,打印和查找location对象
- location包含有关当前 URL 的信息。
- window.location()和document.location()引用的是同一个对象
查询字符串参数
- 解析字符串,逐个访问其中的每个查询字符串参数
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
26function 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=item[i].split("=");
//用decodeURIComponent分别解码name和value,因为查询字符串应该是被编码过的
name=decodeURIComponent(item[0]);
value=decodeURIComponent(item[1]);
if(name.length){
args[name]=value;
}
}
return args;
}
位置操作
location.assign(URL)
可加载一个新的文档location.replace(newURL)
用一个新文档取代当前文档,不能用后退回到前一个页面location.reload(force)
重新加载当前文档location.reload()
有可能从缓存中加载location.reload(true)
强制从服务器加载navigator对象
- navigator包含有关浏览器的信息
检测插件
- 普通浏览器和IE中检测插件的方法不一样,所以一般针对每个插件分别创建检测函数
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
26function hasPlugin(name){
name=name.toLowerCase();
for(var i=0;i<navigator.plugins.length;i++) {
if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
return true;
}
}
return false;
}
//hasIEPlugin中的name是只接收一个COM标识符作为参数
function hasIEPlugin(name){
try{
new ActiveXObject(name);
return true;
}catch(ex){
return false;
}
}
function hasFlash(){
var result=hasPlugin("Flash");
if(!result){
result=hasIEPlugin("ShockwaveFlash.ShockwaveFlash");
}
return result;
}
alert(hasFlash());
注册处理程序
- Navigator.registerContentHandler()和registerProtocolHandler()可以让一个站点指明它可以处理特定类型的信息
screen对象
- screen保存着与客户端显示器有关的信息,其中包括浏览器窗口外部的显示器的信息,如像素宽度和高度等
history对象
- history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。
- history.go() hitory.back() history.foeword()实现在历史记录中向后或向前导航到任意页面
- history.length()保存历史记录的数量,对于加载到窗口、标签页或框架中国的第一个页面而言,history.length=0