BOM

BOM

  1. BOM(Browser Object Model)浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是Window
  2. BOM由一系列相关的对象构成,并且每个对象都提供了很多方法和属性
  3. BOM就是把浏览器当作一个对象,区别于DOM把文档看作一个对象
  4. BOM的*对象是Window,区别于DOM的*对象是document

1. Window对象

  1. 是BOM的*对象,它是JS访问浏览器窗口的一个接口
  2. 它是一个全局对象,定义在全局作用域的变量和函数都会变成window对象的属性和方法,在调用的时候可以省略window,以嵌学习的对话框都属于window对象方法,比如:alert() prompt()等
  3. 注意window下的一个特殊的属性window.name 就是在定义全局变量时,避开name

1. Window对象的常见事件

1. 窗口加载事件

<script>
        window.onload = function(){

        }
        // 或者
        window.addEventListener('load',function(){})
    </script>

window.onload 是 窗口加载事件 ,当文档内容完全加载完成时会触发该事件(就是等图像,脚本文件,CSS文件等加载完毕时),就调用该函数,
有了window.onload ,就可以不像在DOM中需要将script的内容必须写在文档元素的下面,此时可以将JS写在页面元素的上下方,因为onload是等页面内容加载完,再去执行处理函数
window.onload这种传统注册方式只能写一次,如果有多个,会以最后一个为准
window.addEventListener方法却可以写多个

<body>
    <button>
        点击我
    </button>
    <script>
        var btn = document.querySelector('button');
        window.onload = function(){
            alert('22');
        }
        // 或者
        window.addEventListener('load',function(){
            btn.addEventListener('click',function(){
                alert('点击');
            })
        })
        document.addEventListener('DOMContentLoaded',function(){
            btn.addEventListener('click',function(){
                alert('点击');
            })
        })
        // DOMContentLoaded事件触发时,仅当DOM加载完毕,不包括样式表,图片,flash等,IE9以上支持
        // 若页面的图片很多,从用户访问到onload触发可能需要较长的事件,交互效果就不能实现,
        // 必然会影响用户体验,此时用DOMContentLoaded事件合适
    </script>
</body>

2. 调整窗口大小事件

<script>
        window.onresize  = function(){

        }
        //或者
        window.addEventListener('resize',function(){})
    </script>

window.onresize是调整窗口大小事件 ,当窗口的大小发生像素变化时就会触发这个事件
经常利用这个事件完成响应式布局,
window.innerWidth是当前窗口的宽度
window.innerHeight是当前窗口的高度

<style>
        div {
            width: 400px;
            height: 400px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <script>
        window.addEventListener('load', function () {
            var div = document.querySelector('div');
            window.addEventListener('resize', function () {
                console.log(window.innerWidth);
                console.log('变化了');
                if (window.innerWidth <= 400) {
                    div.style.display = 'none';
                }
                else {
                    div.style.display = 'block';
                }
            })
        })
    </script>
    <div></div>
    <!-- 交互效果,当窗口的宽度小于400px时就隐藏该粉色盒子,大于则显示 -->
</body>

3. 定时器

1. window.setTimeout(回调函数,【延迟的毫秒数】) 这个window在调用时可以省略

setTimeout方法用于设置一个定时器,该定时器在定时器到时间后就会执行调用函数
【延迟的毫秒数】可以省略,默认是0秒
页面中可能有多个 定时器,可以给 定时器加标识符(起个名字)

<script>
        //  setTimeout(function(){
        //      alert('时间到了');
        //  },2000);
        //  //两秒后就触发了

         function bao(){
            alert('时间到了');
         }
        //  有多个 定时器,可以给 定时器加标识符
         var t1 = setTimeout(bao,2000);
         var t1 = setTimeout(bao,5000);
    </script>

setTimeout函数也称做回调函数,就是时间到了才会去调用
回调就是回头调用
以前的点击事件,onclick,也是回调函数,只有点击了才会调用

5秒后自动关闭的广告案例

5秒后就将广告图片隐藏起来,用到定时器定时

<body>
    <img src="imagines/tu07.jpg" alt="">
    <script>
         var ad = document.querySelector('img');
         setTimeout(function(){
             ad.style.display='none';
         },5000)
    </script>
清除定时器 window.clearTimeout(定时器标识符) 这个window在调用时可以省略
<script>
         function bao(){
            alert('时间到了');
         }
        //  有多个 定时器,可以给 定时器加标识符
         var t1 = setTimeout(bao,2000);
         clearTimeout(t1);
    </script>
3. window.setInterval(回调函数,【间隔的毫秒数】) 这个window在调用时可以省略

setInterval方法就是每隔一段时间就去调用一次回调函数
【间隔的毫秒数】可以省略,默认是0秒
页面中可能有多个 定时器,可以给 定时器加标识符(起个名字)
区别于setTimeout,是延迟事件到了,就去调用回调函数,只调用一次, 就结束了这个 定时器
而setInterval方法会重复调用回调函数

script>
         function bao(){
            alert('时间到了');
         }
        
         var t1 =  setInterval(bao,2000);
        
    </script>
倒计时案例(目前仍有问题)

分析:

  1. 因为这个倒计时是不断变化的,因此需要 定时器来自动变化(setInterval)
  2. 三个黑色盒子分别存放时分秒
  3. 三个黑色盒子利用innerHTML放入计算的小时分钟秒数
<body>
    <div>
        <span class='hour'>1</span>
        <span class='minute'>2</span>
        <span class='second'>3</span>
    </div>
    <script>
        //1.获取元素
        var hour = document.querySelector('.hour');//小时的黑色盒子
        var minute = document.querySelector('.minute');//分钟的黑色盒子
        var second = document.querySelector('.second');//秒的黑色盒子

        //定义一个全局变量,来接收用户输入的时间,并转换为总的毫秒数
        var inputTime = +new Date('2021-12-7 23:35:00');//返回用户输入的时间的毫秒数

        //先调用一次这个函数,防止第一次刷新页面有空白
        countDown();

        //2. 开启定时器,每个一秒调用封装的倒计时函数
        setInterval(countDown, 1000);

        function countDown() {
            var nowTime = +new Date();//返回当前时间总的毫秒数  
            var times =inputTime > nowTime? (inputTime - nowTime) / 1000:0;      
            // //剩余的时间戳,此处把毫秒换算为秒了
        
            var h = parseInt(times / 60 / 60 %24);
            h = h < 10 ? '0' + h : h;
            hour.innerHTML = h;

            var m = parseInt(times / 60 % 60);
            m = m < 10 ? '0' + m : m;
            minute.innerHTML = m;

            var s = parseInt(times % 60);
            s = s < 10 ? '0' + s : s;
            second.innerHTML = s;
            //将剩余的时分秒分别给各个小盒子



        }

    </script>

</body>
清除定时器 window.clearInterval(定时器标识符) 这个window在调用时可以省略
<body>
    <button class="begin">开启定时器</button>
    <button class="stop">关闭定时器</button>
    <script>
        var begin = document.querySelector('.begin');
        var stop = document.querySelector('.stop');

        var t = null;//此处给定时器设置一个全局的标识符,便于清除定时器
        //因为定时器本身是一个对象,给全局变量赋值为空对象  null
        begin.addEventListener('click',function(){
            t = setInterval(function(){
                 alert('nihao');
            },1000)
        })

        stop.addEventListener('click',function(){
            clearInterval(t);
        })
    </script>
    
</body>
发送短信案例:

就是用户点击发送按钮后,该按钮在三秒之内不能再次点击,防止重复发送短信
分析:

  1. 按钮点击之后,会禁用disabled为true
  2. 同时按钮里面的内容会变化,让用户看到“你还有多少秒再次可以点击”的内容时有秒数的变化,注意button里面的内容通过innerHTML修改
  3. 里面的秒数有变化,要用定时器
  4. 定义一个变量,在定时器里面不断地递减
  5. 如果变量递减到0,说明到了时间,就需要停止定时器,并且回复到按钮的初始状态
<body>
     手机号码:<input type="number"> <button>发送</button>
    <script>
        // 1.获取元素 :按钮点击之后,会禁用disabled为true
        var btn = document.querySelector('button');
        var time = 3;//定义剩下的总秒数
        btn.addEventListener('click',function(){
            btn.disabled = true;
            // 按钮里面的内容会变化:button里面的内容通过innerHTML修改
            //将以上内容写到计数器中,
            var t =setInterval(function(){
               if(time==0){
                   clearInterval(t);
                   btn.disabled = false;
                   btn.innerHTML = "发送";
                   time=3;//此处的3要重置
               }
               else{
                btn.innerHTML = '还剩下'+time+'秒';
                time--;
               }
            },1000)
            
        })
    </script>
    
</body>
上一篇:DOM方式解析XML的时候encoding属性的作用


下一篇:BOM & DOM 编程