zoukankan      html  css  js  c++  java
  • js:BOM(window对象事件、对象的定时器、this指向、js的执行机制)

    1、BOM

    (1)BOM概念

    BOM(Browser Object Model)浏览器对象模型,他提供了独立于内容与浏览器窗口进行交互的对象,核心是window

    有一系列相关的对象域组成,每一个对象都有很多的属性和方法

    是浏览器厂商在各自的浏览器上定义的,兼容性较差

    把浏览器当做一个对象

    顶级对象是window

    学习的是浏览器窗口交互的一些对象

    BOM包含DOM

    (2)DOM(文档对象模型)

    文档对象模型,把文档当做一个对象

    顶级对象是document

    主要是操作页面的元素

    是W3C的标准规范

    (3)window对象

    <body>
            <script>
                var num=90;
               document.onkeyup=function(){
                   window.alert(window.num);
               }
            </script>
        </body>

    • 是js访问浏览器的一个接口
    • 是一个全局对象,定义在全局作用域中的变量、函数都会变成window对象的属性和方法,在调用的时候可以省略window

    2、window对象的常见事件

    (1)窗口加载事件

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
            <script>
                window.onload = function() {
                    var b = document.getElementById("b");
                    b.onclick = function() {
                        alert("hello");
                    }
                }
            </script>
        </head>
    
        <body>
            <button id="b">按钮</button>
        </body>
    
    </html>
    • 有了window的onload事件以后可以把js代码放到页面元素的前面,不用考虑加载顺序的问题,因为onload是在页面的全部内容加载完毕再去执行处理函数
    • 使用传统的事件注册方式,onload事件只能使用一个,如果注册多个的话会以最后一个为准。使用addEventListener没有限制
    • 存在的缺点是如果页面的图片较多,从用户访问到onload事件触发需要经历较长的时间,影响用户的体验

    DOMContentLoaded事件:

        <script>
                document.addEventListener("DOMContentLoaded",function(){
                    alert("123");
                })
            </script>
    • DOMContentLoaded事件触发时,仅当DOM加载完成,不包括css、图片等,可以避免onload的缺点

    (2)resize事件:浏览器的窗口大小变化的时候触发

          <script>
                window.addEventListener("resize",function(){
                    console.log("窗口变化了")
                })
            </script>

    3、windows对象的定时器

    (1)setTimeout函数:用于设置一个定时器,该定时器到期后执行函数,只调用一次函数

    <head>
            <meta charset="UTF-8">
            <title></title>
            <script>
                var myfunction=function(){
                    console.log("窗口变化了")
                }
                window.setTimeout(myfunction,3000);            
            </script>
        </head>

     停止setTimeout定时器:

        <script>
                var myfunction=function(){
                    console.log("窗口变化了")
                }
                window.setTimeout(myfunction,2000);    
                clearTimeout(myfunction);
            </script>

    (2)setInterval定时器

    <head>
            <meta charset="UTF-8">
            <title></title>
            <script>
                var myfunction=function(){
                    console.log("窗口变化了")
                }
                window.setInterval(myfunction,2000);    
            </script>
        </head>

    重复调用一个函数,每隔一段时间调用一次

    关闭setInterval定时器:

    window.clearInterval(myfunction);

    4、this指向问题

    (1)全局作用域或者普通函数中this指向全局对象window

    <head>
            <meta charset="UTF-8">
            <title></title>
            <script>
                console.log(this);
                function f(){
                    console.log(this);
                }
                f();
            </script>
        </head>

     定时器里面的this指向window:

    <script>
              setTimeout(function(){
                  console.log(this);
              },1000)
            </script>

     (2)方法中谁调用谁this就指向谁

    <script type="text/javascript">
                var person = {
                    num:12,
                    sayHi:function(){
                        console.log(this);
                    }
                }
                person.sayHi();
            </script>

     (3)构造函数中,this指向构造函数的实例

    <script type="text/javascript">
                function fun(){
                    console.log(this)
                }
                var fun=new fun();
            </script>

    5、js的执行机制

    (1)js的执行机制

    • JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为Javascript这门脚本语言诞生的使命所致,JavaScript 是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除。
    • 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
    • 为了解决这个问题,利用多核CPU的计算能力, HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程。于是, JS中出现了同步和异步。
    <script>
               console.log(3);
               setTimeout(function(){
                   console.log(2);
               },1000);
               console.log(1);
            </script>

    (2)同步任务与异步任务

    <script>
               console.log(3);
               setTimeout(function(){
                   console.log(2);
               },0);
               console.log(1);
            </script>

     同步任务:

    同步任务都在主线程上执行,形成一个执行栈。

    异步任务:
    JS的异步是通过回调函数实现的,异步任务在任务队列里面
    一般而言, 异步任务有以下三种类型

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

     执行机制:

    • 先执行执行栈中的同步任务
    • 异步任务放在任务队列里面
    • 执行栈中的所有同步任务执行完毕,系统会按照次序读取任务队列中的异步任务
  • 相关阅读:
    jquery之自定义data属性
    js获取显示器、页面等高度 (转)
    A网页高度随B内容而自然变化兼容各种浏览器
    DIV+ul+LI实现表格效果以及div带滑动条
    不同人对待问题不同态度
    MySQL,SqlServer数据库关键字在程序中处理
    一款连接SqlServer的数据库工具
    VB.Net日期格式化的5种使用方法
    MySQL与SqlServer中update操作同一个表问题
    SqlServer中存储过程 returnC#代码处理以及对应的MySQL如何改写
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13389462.html
Copyright © 2011-2022 走看看