ECMAScript是JavaScript的核心,但在web使用JavaScript,那么BOM(浏览器对象模型)才是真正的核心。
BOM的核心对象是window,它表示浏览器的一个实例。
在浏览器中,window对象既是JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。也就是说,在网页中定义的任何一个变量、对象和函数以window作为其Global对象。
1.全局作用域
既然window对象扮演着Global对象,那么所有在全局作用域中声明的对象、变量和函数都会变成window的属性和方法。
定义全局变量和在window对象上定义属性还是有差别的:全局变量不能通过delete删除,而在window对象上定义的属性则可以。
var age=28; window.color="red"; //在IE<9是抛出错误,在其他浏览器中都返回false delete window.age; //在IE<9是抛出错误,在其他浏览器中都返回true delete window.color; //return true alert(window.age); //28 alert(window.color); //undefined
在使用var语句添加window属性时,有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此这样定义的属性不可以通过delete删除。
在尝试访问未声明的变量会抛出错误,但通过查询window对象,可以知道某个可能未声明的变量是否存在。
//这里抛出错误,因为oldValue未声明 var newValue=oldValue; //这里不会抛出错误,因为这是一次属性查询 var newValue=window.oldValue // alert(newValue); //undefined
其实很多全局JavaScript对象如localtion和navigator实际上都是window对象的属性。
2.窗口关系及框架
如果页面中包含框架,则每个框架都有自己的window对象,并保存在frames集合中。
在frame集合中,可以通过数值索引或框架名来进行访问。
<html> <head> <title>Frameset Example</title> </head> <frameset rows="160,*"> <frame src="https://www.jb51.net/frame.htm"> <frameset cols="50%,50%"> <frame src="https://www.jb51.net/anotherframe.htm"> <frame src="https://www.jb51.net/yetanotherframe.htm"> </frameset> </frameset> </html>
就这个例子而言,可以通过window.frames[0]或者window.frames["topFrame"]来引用上方框架。不过最好使用top.frames[0]来访问框架。
top对象始终指向最高(外)层框架,也就是浏览器窗口。使用它可以确保在一个框架中正确地访问另一个框架。
与top对象相对的还有另一个window对象是parent,parent(父)对象始终指向当前框架的直接上层框架。
还有一个self对象,它始终指向window,实际上self与window可以互相使用,引入self对象的目的就只是为了与top和parent对象对应起来。
所有的这些对象,都是window的属性,可以使用window.parent或window.top使用它们。
3.窗口位置
多数浏览器都提供了screenLeft和screenTop,分别用于表示窗口相对与屏幕左边和上边的位置。FF则在screenX和screenY属性中提供相同的窗口信息,Safari金额Chorme也同时支持这两个属性。
使用下面代码可以跨浏览器取得窗口左边和上边的位置。
var leftPos=(typeof window.screenLeft=="number")?window.screenLeft:window.screenX; var topPos=(typeof window.screenTop=="number")?window.screenTop:window.screenY;
值得注意的是,在IE和Opera中screenLeft和screenTop中保存的是从屏幕左边和上边到window对象表示的页面可见区域的距离。在Chrome、FF和Safari中,screenY和screenTop中保存的是整个浏览器对于屏幕的坐标值。
最终结果就是无法在跨浏览器条件下取得窗口左边和上边的精确坐标值。
使用moveTo()和moveBy()方法倒是可以将窗口精确的移动到新位置,两个方法都接收两个参数,moveTo()接收的是x,y轴的坐标,moveBy()接收的是移动的像素。
//将屏幕移动到左上方 moveTo(0,0); //将窗口左移50px moveBy(-50,0);
但是,这两个方法可能会被浏览器禁用。这两个方法也只适用于最外层的window对象,不适用框架。
4.窗口大小
主流浏览器都为确定窗口大小提供了4个属性:innerWidth、innerHight、outerWidth和outerHight。
在IE9+、Safari和FF中,outerWidth和outerHight返回的是浏览器窗口本身的尺寸(无论从哪个框架访问),但在Opera中,这两个属性的值表示页面视图容器的大小(单个标签页窗口的大小)。而innerWidth、innerHight则表示该容器中页面视图的大小(减去边框的宽度)。但在Chrome中,这4个属性都表示视口大小而非浏览器大小。
IE9之前没有提供取得浏览器窗口尺寸的属性;不过它通过DOM提供了页面可视区域的信息。