BOM:浏览器对象模型
这一章,主要讲了window对象,location对象,navigator对象,screen对象和history对象,这是五个BOM对象。
BOM的核心是window,它表示一个浏览器的实例。location则提供了与当前窗口中加载的文档有关的信息。navigator可以识别客户的浏览器的各种信息。
screen基本上只用来表明客户端的能力,用处不大。history中则保存着用户上网的历史记录。
接下来,让我们一个一个的了解下这五个BOM对象:
8.1 window对象
BOM的核心对象是window,表示浏览器的一个实例。
在浏览器中 window由双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象
8.1.1 全局作用域
在所有全局作用域中声明的变量、函数都会变成window对象的属性和方法
8.1.2 窗口关系及框架
8.1.3 窗口位置
跨浏览器取得窗口左边和上边的位置
主要是针对Firefox做兼容,Firefox只支持screenX和screenY
var leftPos = (typeof window.screenLeft == 'number') ?
window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == 'number') ?
window.screenTop : window.screenY;
8.1.4 窗口大小
8.1.5 导航和打开窗口
window.open()
接收四个参数:要加载的url,窗口目标,一个特性字符串,一个表示新页面是否取代浏览器历史记录中当前加载页面的布尔值;
通常只需传递第一个参数,最后一个参数只在不打开新窗口的情况下使用。
(1)弹出窗口
window.open('http://www.tuniu.com','','height=100,width=100,top=100,left=100,resizable=yes')
window.close() //关闭窗口
(2) 安全限制
由于用户安全问题,大多数浏览器都对window.open()做了限制
(3) 弹出窗口屏蔽程序
window.open弹出窗口被屏蔽有两种情况,浏览器内置的屏蔽程序(window.open会返回null)和浏览器扩展或其他程序阻止的弹窗(window.open会报错)
检测window.open弹出窗是否被屏蔽兼容方案:
var blocked = false;
try{
var wroxWin = window.open('http://www.tuniu.com','_blank');
if( wroxWin == null ){
blocked = true;
}
} catch (ex){
blocked = true;
}
if(blocked){
alert('弹窗被屏幕')
}
8.1.6 间歇调用和超时调用
(1)超时调用:指定的时间过后执行代码
timeoutId: 一个数值ID,表示超时调用,这是计划执行的唯一标识符
var timeoutId = setTimeout(function(){
alert('hello world')
},1000)
clearTimeout(timeoutId) //取消超时调用
经过1000秒后,函数不一定会执行,原因是:
JS是一个单线程的解释器,因此一定时间只能执行一段代码。为了控制要执行的代码,就会有一个js任务队列。这些任务会按照它们添加到队列的顺序执行。
setTimeout()的第二个参数是告诉js再过多久把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果不是空的,那么就要等到前面代码执行完了以后再执行。
(2)间歇调用:按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。
var num = 0;
var max = 10;
var intervalId = null;
function incrementNumber(){
num++;
//如果执行次数达到了max设定的值,则取消后续尚未执行的调用
if( num == max ){
clearInterval(intervalId)
alert('Done')
}
}
intervalId = setInterval(incrementNumber, 500);
使用超时调用setTimeout来模拟间歇调用;
var num = 0;
var max = 10;
function incrementNumber(){
num++
if( num < max ){
console.log('11')
setTimeout(incrementNumber, 1000)
} else {
alert('Done')
}
}
setTimeout(incrementNumber, 500)
一般认为,使用超时调用来模拟间歇调用是一种最佳模式。
在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。
所以,最好不要用间歇调用!!!
8.1.7 系统对话框
同步:
alert()
confirm()
prompt()
异步:
window.print() //打印。
window.find() //显示查找对话框
8.2 location对象
location对象是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。
window.location和document.location引用的是同一个对象。
以我司预定页"http://www.tuniu.com/tours/210050902/book/step1"为例:
以下location方法,如果为其赋值,则可改变url
location.hash:返回URL中的hash(#号后跟0或多个字符),如果没有则返回“”
==> “”
location.host:返回服务器名称和端口号
==> "www.tuniu.com"
location.hostname:返回不带端口号的服务器名称
==> "www.tuniu.com"
location.href:返回当前页面完整url
==> "http://www.tuniu.com/tours/210050902/book/step1"
location.pathname:返回url的目录或文件名
==> "/tours/210050902/book/step1"
location.port:返回端口号
==> ""
location.protocol:返回页面使用协议
==> "http:"
location.search:返回url的查询字符串,以问号开头
==> '' 比如:'?q=javascript'
8.2.1 查询字符串参数
8.2.2 位置操作
导航到新的页面:
window.location = '';
location.href = "";
location.assign('');
以上三种方法其实都是调用了assign方法来实现跳转。
如果想在浏览器跳转之后禁用后退按钮,可以:
location.replace('http://www.tuniu.com')
location.reload(); //重新加载(有可能从缓存中加载)
location.reload(true); //重新加载(从服务器重新加载)
8.3 navigator 对象
可在浏览器控制台中输入 navigator 来了解所有浏览器信息。
8.3.1 检查插件
navigator.plugins
8.4 screen 对象
screen对象在js编程中用处不大,基本只是用来表明客户端的能力,其中包括浏览器窗口外部的显示器信息,如像素宽度和高度等。
8.5 history对象
history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。
//后退一页
hostory.go(-1)
//前进一页
history.go(1)
//前进两页
history.go(2)
也可以给go()传递一个字符串,此时浏览器会跳转到历史记录中包含该字符串的第一个位置。
//后退一页
hostory.back()
//前进一页
history.forward();