BOM_1 | 青训营笔记

158 阅读3分钟

BOM_1

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

定义

image.png

构成

image.png

window对象是浏览器的顶级对象,具有双重角色

  1. JS访问浏览器窗口的接口
  2. 全局对象 定义在全局作用域中的变量、函数都会变成window对象的方法和属性
  3. 调用的时候可省略window 如alert() prompt()等
  4. 特殊属性 window.name

窗口加载事件

window.onload 窗口(页面)加载事件,文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS文件等),就调用的处理函数。

注意

  1. 有了window.onload就可以把JS代码写到页面元素的上方,因为onload是等页面内容全部加载完毕再去执行处理函数
  2. window.onload传统方式 只能写一次 否自 以最后一次为准
  3. 如果使用addEventListener 没有限制
        window.onload = function() {
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('点击我');
            })
        }
        window.onload = function() {
            alert(22);
        }
        // 只能执行最后一个 alert(22) alert('点击我')不执行
        window.addEventListener('load', function() {
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('点击我');
            })
        })

        window.addEventListener('load',function() {
            alert('22');
        })
        // addEventListener 无限制

如果页面图片很多,用户访问到Onload则可能需要较长时间,交互效果不能实现,影响体验, 此时用DOMContentLoaded时间比较合适 document.addEventListener('DOMContentLoaded', function(){})

        window.addEventListener('load', function() {
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('点击我');
            })
        })

        window.addEventListener('load',function() {
            alert(22);
        })
        document.addEventListener('DOMContentLoaded', function() {
            alert(33);
        })
        // 1. 33; 2. 22; 3. click

调整窗口大小事件

window.onresize = function(){}<br> window.addEventListener('resize',function(){});

注意:

  1. window.onresize 触发立即调用
  2. 完成响应式布局:window.innerWidth当前屏幕宽度

SetTimeOut

        setTimeout(function() {
            console.log('时间到了');
        }, 2000);   // 默认时间是0,单位是毫秒

        function callback() {
            console.log('爆炸了');
        }   // 定时器很多是,可赋值一个标识符 timer1 = setTimeout()...
        setTimeout(callback, 3000);
        // setTime('callback()', 3000); 我们不提倡这个写法

clearTimeout(timer)

停止计时 clearTimeout(timer); // 传入的是函数名,不带括号

实例:

    var btn = document.querySelector('button');
        var ad = document.querySelector('img');
        var timer = setTimeout(function() {
            ad.style.display = 'none';
        }, 2000)
        btn.onclick = function() {
            clearTimeout(timer);    // 传入的是函数名,不带括号
        }

setInterval

每间隔一段时间 反复调用

    // 语法规范:windowsetInterval(调用函数,延时时间);
    setInterval(function() {
        console.log('继续输出');
        }, 1000);

实例:

        countDown();    /* 先调用一次,防止刷新时有空白 */
        function countDown() {
            var span_1 = document.querySelector('#span_1');
            var span_2 = document.querySelector('#span_2');
            var span_3 = document.querySelector('#span_3');
            var inputTime = +new Date('2023-1-24 18:00:00');
            var nowTime = +new Date();
            var times = (inputTime - nowTime) / 1000;
            var h = parseInt(times / 60 / 60 % 24);
            h = h < 10 ? '0' + h : h;
            span_1.innerHTML = h;
            var m = parseInt(times / 60 % 60);
            m = m < 10 ? '0' + m : m;
            span_2.innerHTML = m;
            var s = parseInt(times % 60);
            s = s < 10 ? '0' + s : s;
            span_3.innerHTML = s;
        }
        setInterval(countDown, 1000);

clearInterval

    var begin = document.querySelector('.begin');
        var stop = document.querySelector('.stop');
        var timer = null; /* 全局变量 置空 */
        begin.addEventListener('click', function() {
           /*  var timer = setInterval(function(){
                console.log('ni hao ma');
            }) */  // 局部变量,外部函数stop无法调用 报错
            timer = setInterval(function() {
                console.log('ni hao ma');
            }, 1000)

        });
        stop.addEventListener('click', function() {
            clearInterval(timer);
        })

实例:发送短信案例

        var btn = document.querySelector('button');
        var time = 3;
        btn.addEventListener('click', function() {
            btn.disabled = true; 
            var timer = setInterval(function() {
                if (time == 0 ) {   // 先计时,每次再判断
                clearInterval(timer);
                btn.disabled = false;
                btn.innerHTML = '发送';
                time = 3;
                } else {
                btn.innerHTML = '还剩'+time+'秒';
                time--;
                }
            }, 1000);
        })

this 指向问题

// this 指向问题 一般情况下 this 最终指向的是调用它的对象
        
        // 1 全局作用域或者普通函数中 this 指向全局对象 window (注意定时器力的this也指向window)
        console.log(this); // window

        function fn() {
            console.log(this);
        }
        window.fn(); // window
        
        window.setTimeout(function() {
            console.log(this);

        },1000); // window
        
        // 2 方法调用中谁调用 this 指向谁
        var o = {
            sayHi: function() {
                console.log(this);
            }
        }
        o.sayHi();  // object>sayHi()

        var btn = document.querySelector('button');
        btn.onclick = function() {
            console.log(this);  // 指向btn按钮
        }


        btn.addEventListener('click', function() {
            console.log(this);
        })
        // 3 构造函数this指向构造函数实例
        function Fun() {
            console.log(this);  // this 指向的是fun 实例对象
        }
        var fun = new Fun();

同步和异步

image.png

js执行机制

事件循环(eventloop)由于主线程不断地重复获得任务、执行任务、再获取、再执行……

image.png

location 对象

URL

image.png

属性

image.png

方法

image.png

history

image.png

offsetLeft 和 offsetTop 获取元素偏移

动态得到元素位置(带定位) 大小(包含padding + border + width) image.png

注:parentNode 返回亲爸爸 不管有无定位;offsetParent 返回有定位

offset 和 style 区别

image.png

client

image.png

scroll

scrollHeight 真正的内容大小 不单指盒子大小 image.png

三大系列对比

主要用法:

  • offset系列用于获取元素位置 offsetLeft offsetTop
  • client用于获取元素大小 clientWidth clientHeight
  • scroll 用于获取滚动距离 scrollTop scrollLeft
  • 注意页面滚动距离通过window.pageXOffset获得

Image.png

参考资料:黑马程序员JavaScript核心教程,前端基础教程,JS的DOM BOM操作教程_哔哩哔哩_bilibili

附:如有错误,恳请指正,侵权必删: