• js BOM操作


    BOM:Browser Object Model, 浏览器对象模型。


    window.onload

    在html中,通常js代码要放在元素之下,否则会报错。比如在元素之前的script中给一个button绑定onclick事件,会报错:Uncaught TypeError: Cannot set property 'onclick' of null

    有了window.onload 后就可以把js代码写到页面元素的上方,因为onload是等页面内容全部加载完毕后才去执行处理函数。

    • 传统使用多个window.onload时会发生冲突,后一个会覆盖前一个。
    • 多个addEventListener也不会冲突。
    • load必须等页面内容全部加载完,包含页面dom元素、图片、flash、css等。
    • DOMContentLoaded是DOM加载完毕,不包含图片、falsh、css等就可以执行,加载速度比load更快一些。
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <body>
            <script type="text/javascript">
                // var btn1 = document.querySelector("#btn1");
                // btn1.onclick = function(){
                //     console.log("传统方式函数在元素之前时,不会触发,并且会报错");
                // }
                
                window.onload = function(){
                    var btn2 = document.querySelector("#btn2");
                    btn2.onclick = function(){
                        console.log("window.onload时窗口(页面)加载事件,当文档内容完全加载完成后触发(包括图像、脚本文件、测试士、文件等)");
                    }
                }
                window.onload = function(){
                    var btn2 = document.querySelector("#btn2");
                    btn2.addEventListener("click",function(){
                        console.log("但是传统使用多个window.onload时会发生冲突,后一个会覆盖前一个");
                    })
                }
                
                window.addEventListener("load",function(){
                    var btn3 = document.querySelector("#btn3");
                    btn3.addEventListener("click",function(){
                        console.log("推荐这样使用");
                    })
                })
                window.addEventListener("load",function(){
                    var btn3 = document.querySelector("#btn3");
                    btn3.addEventListener("click",function(){
                        console.log("多个addEventListener也不会冲突");
                    })
                })
                
                window.addEventListener("DOMContentLoaded",function(){
                    var btn3 = document.querySelector("#btn3");
                    btn3.addEventListener("click",function(){
                        console.log("load必须等页面内容全部加载完,包含页面dom元素、图片、flash、css等。");
                        console.log("DOMContentLoaded是DOM加载完毕,不包含图片、falsh、css等就可以执行,加载速度比load更快一些");
                    })
                })
            </script>
            <button id="btn1">btn1</button>
            <button id="btn2">btn2</button>
            <button id="btn3">btn3</button>
        </body>
    </html>


      定时器

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <body>
        </body>
        <script type="text/javascript">
            window.setTimeout(function() {
                console.log("window.setTimeout定时器");
            }, 1000)
            setTimeout(function() {
                console.log("window可以省略");
            }, 1000)
            var timmer= window.setInterval(function(){
                console.log("window.setInterval循环定时器,window可以省略");
            },1000)
            
            setTimeout(function() {
                clearInterval(timmer);
                console.log("清除定时器");
            }, 5000)
        </script>
    </html>


     this 指向

    • 一般情况下,this的最终指向是调用它的那个对象。
    • 全局作用域或者普通函数中this只想全局对象window(定时器中的window省略了,this也指向window)
    var btn = document.querySelector("button");
    btn.onclick = function() {
        //一般情况下,this的最终指向是调用它的那个对象
        console.log("一般情况:",this);
    }

     

    // 全局作用域或者普通函数中this只想全局对象window(定时器中的window省略了,this也指向window)
    console.log("全局作用域:",this);
    function fn(){
        console.log("普通函数:",this);
    }
    window.fn();//和 fn(); 等价


    js 的同步和异步

    js的同步是顺序执行,形成一个执行栈。

    js异步是通过回调函数实现的:

    1. 普通事件,如 click,resize等
    2. 资源加载,如load、error等
    3. 定时器,包括setInterval, setTimeout等

    js执行机制

    1. 先执行执行栈中的同步任务
    2. 异步任务(回调函数)放到任务队列(消息队列)中
    3. 执行栈中的同步任务执行完毕后,系统会按次序读取任务队列中的异步任务,然后被读取的异步任务进入执行栈开始执行
    console.log(1);
    setTimeout(function() {
        console.log(4);
    }, 2000)
    setTimeout(function() {
        console.log(3);
    }, 1000)
    console.log(2);

  • 相关阅读:
    CentOS 下搭建Jenkins
    SRVE0255E: 尚未定义要处理 ***的 Web 组/虚拟主机。
    WebSphere Application Server中manageprofiles的使用
    WAS 与IHS集成问题
    CentOS ln 链接
    VIM常见命令
    虚拟机VM下CentOS7部署WASND9+HTTP9
    CentOS7下安装GUI图形界面
    CentOS 系统时间与硬件时间
    hive 排序和聚集
  • 原文地址:https://www.cnblogs.com/sunshine233/p/15624387.html
Copyright © 2020-2023  润新知