BOM(浏览器对象模型)提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。
8.1 window对象
window对象既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。
8.1.1 全局作用域
全局作用域中声明的变量,函数都会变成window对象的属性和方法。
定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接在window对象上的定义的属性可以。
//使用var语句添加的window属性有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此这样定义的属性不可以通过delete操作符删除。
var age = 29;
window.color = "red";
//在IE < 9 时抛出错误,在其他所有浏览器中都返回false
delete window.age;
//在IE < 9 时抛出错误,在其他所有浏览器中都返回true
delete window.color;
alert(window.age);//29
alert(window.color);//undefined
尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在。
//这里会抛出错误,因为oldValue未定义
var newValue = oldValue;
//这里不会抛出错误,因为这是一次属性查询
var newValue = window.oldValue;//undefined
8.1.2 窗口关系及框架
top对象始终指向最高(最外)层的框架,也就是浏览器窗口。
window对象指向的都是那个框架的特定实例,而非最高层的框架。
parent(父)对象始终指向当前框架的直接上层框架,在没有框架的情况,parent一定等于top。
self对象,他始终指向window
window.frames[0];
window.frames["topFrame"];
top.frames[0];
top.frames["topFrame"];
frames[0];
frames["topFrame"];
8.1.3 窗口位置
screenLeft和screenTop属性,分别用于表示窗口相对于屏幕左边和上边的位置。
screenX和screenY相同。
8.1.4 窗口大小
用处不大,略
8.1.5 导航和打开窗口
window.open()
window.opener保存着打开它的原始窗口对象。这个属性只在弹出窗口中的最外层window对象(top)中有定义,而且指向调用window.open()的窗口或框架。
//检测弹出窗口是否被屏蔽
var blocked = false;
try{
var wroxWin = window.open("http://xxx","_blank");
if(wroxWin == null){
blocked = true;
}
} catch (ex){
blocked = true;
}
if(blocked){
alert("The popup was blocked!");
}
8.1.6 间歇调用和超时调用
//超时调用,指定的时间过后执行代码,第二个参数告诉JavaScript再过多少时间把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行
var timeoutId = setTimeout(function(){
alert("Hello world!");
},1000);
//把它取消
clearTimeout(timeoutId);
//间歇调用
var intervalId = setInterval(function(){
alert("Hello world!");
},1000);
//把它取消
clearInterval(intervalId);
超时调用的代码都是在全局作用域中执行,this的值在非严格模式下指向window对象,在严格模式下是undefined。
使用超时调用来模拟间歇调用的是一种最佳模式。
8.1.7 系统对话框
略
8.2 location对象
属性名 | 例子 |
---|---|
hash | “#contents” |
host | “write.blog.youkuaiyun.com:80” |
hostname | “write.blog.youkuaiyun.com” |
href | “http://write.blog.youkuaiyun.com/mdeditor” |
pathname | “/mdeditor” |
port | “8080” |
protocol | “http:” |
search | “?q=javascript” |
8.2.1 查询字符串参数
location.search的参数需要用decodeURIComponent()解码
8.2.2 位置操作
打开新URL
location.assign("http://write.blog.youkuaiyun.com/mdeditor");
window.location = "http://write.blog.youkuaiyun.com/mdeditor";
location.href = "http://write.blog.youkuaiyun.com/mdeditor";
修改location对象的属性都会在浏览器历史记录中生成一条新记录,用户可以通过“后退”回到前一个页面。要禁用可以采用replace()方法。
location.replace("http://write.blog.youkuaiyun.com/mdeditor");
reload()重新加载当前显示的页面。建议放在最后一行。
location.reload();//重新加载(有可能从缓存中加载)
location.reload(true);//重新加载(从服务器重新加载)
8.3 navigator对象
识别客户端浏览器的事实标准。
8.3.1 检测插件
//非ie,读取插件名判断是否存在
navigator.plugins[i].name
//ie
try{
new ActiveXObject(name);
return true;
}catch(ex){
return false;
}
8.3.2 注册处理程序
略
8.4 screen对象
略
8.5 history对象
history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。
//后退一页
history.go(-1);
//前进一页
history.go(1);
//前进两页
history.go(2);
//跳转到最近的wrox.com页面
history.go("wrox.com");
//后退
history.back();
//前进
history.forward();
history.length;