浏览器对象模型---BOM

一.window

BOM的核心对象是window,表示浏览器的一个实例。
    在浏览器中,window有两种角色
    1.js访问浏览器窗口的一个接口
    2.ECMAScript固定的Global对象

1.全局作用域

在全局中定义的变量和函数都是window的属性和方法。
        var age = 2;
        function say(){
            alert(this.age);
        }
        alert(window.age);//2
        say();//2
        window.say();//2
但是在全局定义的和直接定义在window上的还是有区别的,直接定义在window上的可以delete;
        var age = 2;
        window.color = "red";   
        delete age;                   //IE9前报错,其他浏览器返回false
        delete window.color;          //IE9前报错,其他浏览器返回true
        console.log(window.age);              //2
        console.log(window.color)         //undefined
另外:访问没有定义的变量会抛出错误。
    //会抛出错误,因为b没有定义
    var a = b;

    //不会抛出错误,因为window.b会是一种属性查询,返回undefined
    var a = window.b;

后面的很多js对象(location和navigatot)实际上都是window对象的属性

2.窗口关系及框架

利用html的frame标签可以在a页面引用不用的页面,也就是可以引用不同的框架
也就是说可以有多个window对象。
    <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Document</title>
            <script type="text/javascript" src="jquery.min.js"></script>
        </head>
        <!-- <body>
        </body> 注意要放在body中-->
            <frameset cols="50%,50%">
              <frame src="./a.html"/>
              <frame src="./b.html"/>
            </frameset>
        </html>

3.窗口位置

screenLeft:窗口相对于屏幕左边的位置
screenTop:窗口相对于屏幕上边的位置
(IE,chrome,Opera,Safari可以用,但是火狐u不行)

screenX:窗口相对于屏幕左边的位置
screenY:窗口相对于屏幕上边的位置
(Opera浏览器不行)


所以可以用兼容的写法(支持的显示number,不支持的显示undefined)
var leftPos = (type of screenLeft == "number")?screenLeft:screenX;
var topPos = (type of screenTop == "number")?screenTop:screenY;

//调整浏览器位置
moveTo(0,0);                                //IE有效,移动到0,0坐标
moveBy(10,10);                          //IE有效,向下和右分别移动10像素
PS:由于此类方法被浏览器禁用较多,用处不大。

4.窗口的大小

Firefox、Safari、Opera和Chrome均为此提供了4个属性:innerWidth和innerHeight,返回浏览器窗口本身的尺寸;outerWidth和outerHeight,返回浏览器窗口本身及边框的尺寸。
console.log(innerWidth);                            //页面长度
console.log(innerHeight);                           //页面高度
console.log(outerWidth);                            //页面长度+边框
console.log(outerHeight);                           //页面高度+边框
PS:在Chrome中,innerWidth=outerWidth、innerHeight=outerHeight;
PS:IE没有提供当前浏览器窗口尺寸的属性。

在IE以及Firefox、Safari、Opera和Chrome中,document.documentElement.clientWidth和document.documentElement.clientHeight中保存了页面窗口的信息。
PS:在IE6中,这些属性必须在标准模式下才有效;如果是怪异模式,就必须通过document.body.clientWidth和document.body.clientHeight取得相同的信息。

//如果是Firefox浏览器,直接使用innerWidth和innerHeight
var width = window.innerWidth;              //这里要加window,因为IE会无效,就不会报错而是undefined
var height = window.innerHeight;
    if (typeof width != 'number') {             //如果是IE,就使用document     
        if (document.compatMode == 'CSS1Compat') {
            width = document.documentElement.clientWidth;
            height = document.documentElement.clientHeight;
        } else {
            width = document.body.clientWidth;  //非标准模式使用body
            height = document.body.clientHeight;
        }
    }
PS:以上方法可以通过不同浏览器取得各自的浏览器窗口页面可视部分的大小。document.compatMode可以确定页面是否处于标准模式,如果返回CSS1Compat即标准模式。


//调整浏览器大小
resizeTo(200,200);                          //IE有效,调正大小
resizeBy(200,200);                          //IE有效,扩展收缩大小
PS:由于此类方法被浏览器禁用较多,用处不大。

5.间歇调用和超时调用

JavaScript是单线程语言,但它允许通过设置超时值和间歇时间值来调度代码在特定的时刻执行。前者在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码。
超时调用需要使用window对象的setTimeout()方法,它接受两个参数:要执行的代码和毫秒数的超时时间。
    setTimeout("alert('Lee')", 1000);               //不建议直接使用字符串

    function box() {
        alert('Lee');
    }
    setTimeout(box, 1000);                      //直接传入函数名即可

    setTimeout(function () {                        //推荐做法
        alert('Lee');
    }, 1000);
PS:直接使用函数传入的方法,扩展性好,性能更佳。

调用setTimeout()之后,该方法会返回一个数值ID,表示超时调用。这个超时调用的ID是计划执行代码的唯一标识符,可以通过它来取消超时调用。
要取消尚未执行的超时调用计划,可以调用clearTimeout()方法并将相应的超时调用ID作为参数传递给它。
    var box = setTimeout(function () {              //把超时调用的ID复制给box
        alert('Lee');
    }, 1000);

    clearTimeout(box);                          //把ID传入,取消超时调用
间歇调用与超时调用类似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。设置间歇调用的方法是setInterval(),它接受的参数与setTimeout()相同:要执行的代码和每次执行之前需要等待的毫秒数。
    setInterval(function () {                       //重复不停执行
        alert('Lee');
    }, 1000);
取消间歇调用方法和取消超时调用类似,使用clearInterval()方法。但取消间歇调用的重要性要远远高于取消超时调用,因为在不加干涉的情况下,间歇调用将会一直执行到页面关闭。
    var box = setInterval(function () {             //获取间歇调用的ID
        alert('Lee');
    }, 1000);

    clearInterval(box);                         //取消间歇调用
但上面的代码是没有意义的,我们需要一个能设置5秒的定时器,需要如下代码:
    var num = 0;                                //设置起始秒
    var max = 5;                                //设置最终秒

    setInterval(function () {                       //间歇调用
        num++;                              //递增num
        if (num == max) {                       //如果得到5秒
            clearInterval(this);                    //取消间歇调用,this表示方法本身
            alert('5秒后弹窗!');            
        }   
    }, 1000);                                   //1秒
一般认为,使用超时调用来模拟间歇调用是一种最佳模式。在开发环境下,很少使用真正的间歇调用,因为需要根据情况来取消ID,并且可能造成同步的一些问题,我们建议不使用间歇调用,而去使用超时调用。
    var num = 0;
    var max = 5;
    function box() {
        num++;
        if (num == max) {
            alert('5秒后结束!');
        } else {
            setTimeout(box, 1000);
        }
    }
    setTimeout(box, 1000);                      //执行定时器
PS:在使用超时调用时,没必要跟踪超时调用ID,因为每次执行代码之后,如果不再设置另一次超时调用,调用就会自行停止。

二.location对象

location是BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。事实上,location对象是window对象的属性,也是document对象的属性;所以window.location和document.location等效。

alert(location);                                //获取当前的URL

location对象的属性
属性                  描述的URL内容
hash                如果该部分存在,表示锚点部分
host                主机名:端口号
hostname            主机名
href                整个URL
pathname            路径名
port                端口号
protocol            协议部分
search              查询字符串

location对象的方法
方法              功能
assign()        跳转到指定页面,与href等效
reload()        重载当前URL
repalce()       用新的URL替换当前页面

location.hash = '#1';                       //设置#后的字符串,并跳转
alert(location.hash);                       //获取#后的字符串

location.port = 8888;                       //设置端口号,并跳转
alert(location.port);                           //获取当前端口号,

location.hostname = 'Lee';                  //设置主机名,并跳转
alert(location.hostname);                   //获取当前主机名,

location.pathname = 'Lee';                  //设置当前路径,并跳转
alert(location.pathname);                   //获取当前路径,

location.protocal = 'ftp:';                     //设置协议,没有跳转
alert(location.protocol);                       //获取当前协议

location.search = '?id=5';                  //设置?后的字符串,并跳转
alert(location.search);                     //获取?后的字符串

location.href = 'http://www.baidu.com';         //设置跳转的URL,并跳转
alert(location.href);                           //获取当前的URL

在Web开发中,我们经常需要获取诸如?id=5&search=ok这种类型的URL的键值对,那么通过location,我们可以写一个函数,来一一获取。
function getArgs() {
    //创建一个存放键值对的数组
        var args = [];              
    //去除?号          
        var qs = location.search.length > 0 ? location.search.substring(1) : '';
    //按&字符串拆分数组
        var items = qs.split('&');
        var item = null, name = null, value = null;
    //遍历
        for (var i = 0; i < items.length; i++) {
            item = items[i].split('=');
            name = item[0];
            value = item[1];
    //把键值对存放到数组中去
            args[name] = value;
        }
        return args;
    }

    var args = getArgs();
    alert(args['id']);
    alert(args['search']);

    location.assign('http://www.baidu.com');        //跳转到指定的URL

    location.reload();                          //最有效的重新加载,有可能从缓存加载
    location.reload(true);                      //强制加载,从服务器源头重新加载

    location.replace('http://www.baidu.com');       //地址直接替换为参数中的地址,可以避免产生跳转前的历史记录

三.history对象

history对象是window对象的属性,它保存着用户上网的记录,从窗口被打开的那一刻算起。
history对象的属性
属性  描述URL中的哪部分
length  history对象中的记录数


history对象的方法
方法  功能
back()  前往浏览器历史条目前一个URL,类似后退
forward()   前往浏览器历史条目下一个URL,类似前进
go(num) 浏览器在history对象中向前或向后
    function back() {                           //跳转到前一个URL
        history.back(); 
    }

    function forward() {                        //跳转到下一个URL
        history.forward();
    }

    function go(num) {                          //跳转指定历史记录的URL
        history.go(num);
    }
PS:可以通过判断history.length == 0,得到是否有历史记录。

猜你喜欢

转载自blog.csdn.net/haochangdi123/article/details/77248035