8.1window对象
BOM的核心对象是window,它表示浏览器的一个实例。既是javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。这意味着在网页中定义的任何一个对象、变量和函数,都以window作为其Global对象,因此有权访问parseInt()等方法。
8.1.1全局作用域
由于window对象同时扮演者ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。栗子:
var age = 29;
function sayAge() {
alert( this.age )
}
alert ( window.age ) //29
sayAge() // 29
window.sayAge() //29
解释:我们在全局作用域中定义了变量age和函数sayAge(),它们被自动归在window对象名下。于是,可以通过window.age 访问变量age,通过window.sayAge() 访问函数sayAge()。
8.1.3窗口位置
1:获取窗口位置
screenLeft / screenTop / screenX / screenY
Ie,Safari,Opera,Chrome浏览器提供了screenLeft 和 screenTop属性来确定window窗口位置。
Fixefox , Safari,Chrome 支持screenX 和 screenY。
跨浏览器取得窗口左边和上边的位置。栗子:
var leftPos = ( typeof window.screenLeft == "number")?window.screenLeft : windon.screenX;
var topPos = ( typeof window.screenTop == "number")?window.screenTop : window.screenY;
2:移动窗口位置
moveTo() 接受两个参数。新位置的x和y坐标值,moveBy() 接受水平和垂直方向上移动的像素数。栗子:
// 将窗口移动到屏幕左上角
window.moveTo(0,0);
// 将窗口向下移动100像素
window.moveBy(0,100)
// 将窗口移动到(200,300)
window.moveTo(200,300)
// 将窗口向左移动50像素
window.moveBy(-50,0)
解释:这两个方法可能被浏览器禁用;这两个方法都不适用于框架,只能对最外层的window对象适用。
8.1.4窗口大小
1:获取窗口大小
innnerWidth / innnerHeight / outerWidth / outerHeight / document.documentElement.clientHeight / document.documentElement.clientWidth / document.body.clientWidth / document.body.clientHeight 获取页面视口大小。
栗子:
var pageWidth = window.innerWidth,
pageHeight = window.innerHeight;
if( typeof pageWidth != "number"){
if( document.compatMode == "CSS1Compat"){ // document.compatMode 页面是否处于标准模式
pageWidth = document.documentElement.clientWidth;
pageHeight = document.documentElement.clientHeight;
}else{
pageWidth = document.body.clientWidth;
pageHeight = document.body.clientHeight;
}
}
2:调整窗口大小
resizeTo() / resizeBy() 调整浏览器窗口大小。这两个方法接受两个参数。
resizeTo() 接收浏览器窗口的新高度和新宽度。resizeBy() 接收新窗口与原窗口的宽度和高度之差。栗子:
// 调整到 100 * 100
window.resizeTo(100,100)
// 调整到 200*150
window.resizeBy(100,50)
// 调整到 300*300
window.resizeTo(300,300)
8.1.5导航和打开窗口
1:弹出窗口
window.open() 可以导航到一个特定URL,也可以打开一个新的浏览器窗口。
此方法接收4个参数:要加载的URL、窗口目标、一个特定字符串、一个表示新页面是否取代浏览器历史记录中当前加载页面的布尔值。通常只需传第一个参数,最后一个参数只在不打开新窗口的情况下使用。
// 等同于 <a href = "http://www.wrox.com" target = "topFrame" ></a>
window.open("http://www.wrox.com", "topFrame")
解释:第二个参数也可以是:_self 、_parent 、_top 、_blank
有些浏览器不允许针对主浏览器窗口调整大小或移动位置,但可以通过window.open()创建窗口调整。栗子:
var wroxWin = window.open('http://www.wrox.com','topFrame','height=400,width=400,top=10,left=10,resizeable=yes')
// 调整大小
wroxWin .resizeTo(500,500);
wroxWin.moveTo(100,100);
// close() 方法还可以关闭新打开的窗口
wroxWin.close() 但是这个方法仅适用于通过window.open() 打开的窗口
将opener设置为null就是告诉浏览器新创建的标签页不需要与打开它的标签页通信,因此可以在独立的进程中运行。标签页之间的联系一旦切断,将没有办法恢复。栗子:
wroxWin.opener = null
2:弹出窗口屏蔽程序
如果是浏览器扩展程序或其他程序阻止了弹出窗口,那么window.open()通常会抛出一个错误。因此,想要准确的检测出弹出窗口是否被屏蔽,必须在检测返回值的同时,将对window.open()的调用封装在一个try-catch块中。栗子:
var blocked = false;
try{
var wroxWin = window.open("http://www.wrox.com","_blank")
if(wroxWin == null){
blocked = true;
}
}catch(ex){
blocked = true
}
if(blocked){
alert("the popup was blocked!")
}
8.1.6间歇调用和超时调用
1:setInterval
//不建议传递字符串!
setInterval ("alert('Hello world!') ", 10000);
//推荐的调用方式
setInterval (function() {
alert("Hello world!");
}, 10000);
2:setTimeout
var timeoutId = setTimeout(function() {
alert("Hello world!");
}, 1000);
//注意:把它取消
clearTimeout(timeoutId);
3:替代间歇调用
在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。
而像前面示例中那样使用超时调用,则完全可以避免这一点。所以,最好不要使用间歇调用
var num = 0;
var max = 10;
function incrementNumber() {
num++;
//如果执行次数未达到 max 设定的值,则设置另一次超时调用
if (num < max) {
setTimeout(incrementNumber, 500);
} else {
alert("Done");
}
}
setTimeout(incrementNumber, 500);