• BOM概述
  • window对象的常见事件
  • 定时器
  • js执行机制
  • location对象
  • navigator对象
  • history对象

# 什么是BOM

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

BOM由一系列相关的对象构成,并且每个对象都提供了喝多方法与属性

BOM缺乏标准,js语法的标准化组织是ECMA DOM的标准化组织是W3C, BOM最初是Netscape浏览器标准的一部分

DOM BOM
文档对象模型 浏览器对象模型
DOM就是把【文档】当做一个【对象】来看待 把浏览器当做一个对象来看待
DOM的顶级对象是document BOMd顶级对象是Window
DOM主要学习的是操作页面元素 DOM学习的是浏览器窗口交互的一些对象
DOM是W3C标准规范 BOM是浏览器厂商在各自浏览器上定义的,兼容较差

# BOM的构成

BOM比DOM更大,它包含DOM

window
document location navigation screen history

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

  1. 它是js访问浏览器窗口的一个接口
  2. 它是一个全局对象,定义在全局作用域中的变量,函数都会编程window对象的属性和方法
  3. 在调用的时候可以省略window alert() prompt()都属于window对象方法

注意: window下的一个特殊属性window.name

# window常见事件

# 窗口加载事件

window.onload =function(){};
或者
window.addEventListener("load",function(){});

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

注意

  1. 有了window.onload 就可以把js代码写到页面元素 的上方,因为onload是等页面内容全部加载完毕,再去执行处理函数
  2. window.onload传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload为准
  3. 如果使用addEventListener则没有限制
document.addEventListener('DOMContentLoaded',function(){})

DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等

<body>
    <script>
        // var btn = document.querySelector('button');
        // btn.addEventListener('click',function(){
        //     alert('her')
        // })
        // window.onload =function(){
        //     var btn = document.querySelector('button');
        //     btn.addEventListener('click',function(){
        //     alert('her')
        //     })
        // }

        // window.onload =function(){
        //  alert('mmmmm')
        // }
        window.addEventListener('load',function(){
                var btn = document.querySelector('button');
                btn.addEventListener('click',function(){
                alert('11')
                })
        })

        window.addEventListener('load',function(){
           alert('22')
        })

        document.addEventListener('DOMContentLoaded',function(){
            alert('33')
        })
    </script>
    <button>按下</button>
</body>

# 调整窗口大小事件

window.onresize = function(){}
window.addEventListener("resize",function(){})

window.onresize 是调整窗口大小加载事件,当触发时就调用的处理函数

注意:

  1. 只要窗口大小发生像素变化,就会触发这个事件
  2. 利用这个事件完成响应式布局,window.innerWidth当前屏幕的宽度

# 定时器

# 两种定时器

window对象给我们提供了2个非常好用的方法 定时器

  • setTimeout()
  • setInterval()
window.setTimeout(调用函数,[延迟的毫秒数]);
  1. setTimeout()方法用于设置一个定时器,该定时器在定时器到期后执行调用函数
  2. setTimeout()这个函数我们也称为回调函数callback
  3. 普通函数是按照代码顺序直接调用
  4. setTimeout() 需要等待时间时间到了才去调用这个函数,因此称为回调函数

注意

  1. window可以省略
  2. 这个调用函数可以直接写函数或者写函数名 或者采取字符串'函数名()'三种形式,第三种不推荐
  3. 延迟的毫秒数省略默认是0,如果写,必须是毫秒
  4. 因为定时器可能有很多,所以我们经常给定时器赋值一个标识符
 <script>
        // setTimeout(function(){
        //     console.log("setTimeout");
        // }, 2000);

        function fn(){
            console.log('hello');
        }
      var time1 =  setTimeout(fn,2000)
      var time1 =  setTimeout(fn,5000)
    </script>

# 停止setTimeout()定时器

window.clearTimeout(timeoutID)

clearTimeout()方法取消了先前通过setTime()建立的定时器。

注意

  1. window可以省略
  2. 里面的参数就是定时器的标识符
<body>
    <button>stop</button>
    <script>
        var btn = document.querySelector('button');
        var time =  setTimeout(function(){
            console.log("biubiu");
        },5000)

        // 停止
        btn.addEventListener('click',function(){
            console.log("stop");
            clearTimeout(time);
        })

    </script>
</body>

# setInterval()定时器

window.setInterval(回调函数,[间隔的毫秒数]);

setInterval()方法重复调用一个函数,每隔这个时间,就去调用一次回调函数

注意:

  1. window可以省略
  2. 这个调用函数可以直接写函数或者写函数名 或者采取字符串'函数名()'三种形式,第三种不推荐
  3. 延迟的毫秒数省略默认是0,如果写,必须是毫秒
  4. 因为定时器可能有很多,所以我们经常给定时器赋值一个标识符

# 停止setInterval()定时器

window.clearInterval(intervalID);

clearInterval()方法取消了先前通过调用setInterval()建立的定时器

注意:

  1. window可以省略
  2. 里面的参数就是定时器的标识符

# this

this的指向在函数定义的时候是确定不了的,只有在函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的函数

  1. 全局作用域或者普通函数中 this 指向window (定时器里面的this指向window)
  2. 方法中谁调用 this指向谁
  3. 构造函数中this指向构造函数的实例
   <script>
        // 1.全局作用域或者普通函数中 this 指向window (定时器里面的this指向window)
        console.log(this);
        function fn(){
            console.log(this);
        }
        fn(); //window.fn()

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

        // 3.构造函数中this指向构造函数的实例
        function Fun(){
            console.log(this); //this指向的是fun实例对象
        }
        var  fun = new Fun()
    </script>

# js执行机制

# js是单线程

  1. JavaScript语言的一大特点就足单线程,也就是说,同一个时间只能做一件事。这是囚为Javascript这门脚本诒言诞生的使命所致——Javascript 是为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除
  2. 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是∶如果jS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

# 同步和异步

为了解决这个问题,利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程。于是,JS中出现了同步和异步。

# 同步

前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分钟之后),再去切菜,炒菜。

# 异步

你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。比如做饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。

# 同步任务

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

# 异步任务

JS的异步是通过回调函数实现的。

一般而言,异步任务有以下三种类型:

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

异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)。

# js执行机制

  1. 先执行执行栈中的同步任务。
  2. 异步任务(回调函数)放入任务队列中。
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环(eventloop)

# location对象

# 什么是location对象

window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL。因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象。

# URL

统一资源定位符(Uniform Resource Locator, URL)是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL的一般语法格式为:

protocol://host[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#link
组成 说明
protocol 通讯协议 常用的http,frp,maito等
host 主机(域名) www.itheima.com
port 端口号 可选 省略时使用法案的默认端口 如http 默认端口为80
path 路径 由 零或多个‘/’符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
query 参数 以键值对的形式,通过&符号分割开来
fragment 片段 #后面内容常见于链接 锚点

# location对象属性

location对象属性 返回值
location.href 获取或者设置 整个URL
location.host 返回主机(域名) www.itheima.com
location.port 返回端口号 如果未写 返回 空字符
location.pathname 返回路径
location.search 返回参数
location.hash 返回片段 # 后面内容 常见于链接锚点

重点记住: href search

   //5s后页面跳转
   <button>跳转</button>
    <script>
        var btn = document.querySelector('button');
        // btn.addEventListener('click',function(){
        //     location.href = 'https://blog.maimaio.cn/'
        // })
        
        var time =5;
        setInterval(Location,1000)
        function Location(){
            if(time == 0){
                 location.href = 'https://blog.maimaio.cn/'
            }else{
                btn.innerHTML = '还剩'+time+'秒'
                time--;
            }
        }
    </script>

# 获取URL参数

page1: login.html

<body>
    <h2>登录</h2>
    <form action="index.html">
        <label for="">输入姓名</label>
        <input type="text" name="usrname">
        <button>登录</button>
    </form>
    <script>
       
    </script>
</body>

page2: index.html

<body>
    <div></div>
    <script>
         console.log(location.search);//?usrname=e
        //  1.先去掉 ? substr('起始位置',截取几个字符)
        // console.log(location.search.substring(1));
        var obj = location.search.substring(1);
        // split() 利用=把数据割为数组
        var arr = obj.split('=');
        console.log(arr);
        var div =document.querySelector('div');
        div.innerHTML = ''+arr[1]+',你好'
    </script>
</body>

# location对象的方法

location对象方法 返回值
location.assign() 跟href一样,可以跳转页面(也称为重定向页面)
location.replace() 替换当前页面,因为不记录历史,所以不能后腿页面
location.reload() 重新加载页面,相当于刷新按钮或者F5,如果参数为true,强制刷新CTRL+F5
<body>
    <button>按下</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click',function(){
            // assign记录浏览器历史,所以可以实现后退功能
            // location.assign('http://www.itcast.cn');
            // replace不记录浏览器历史,所以不可以实现后退功能
            // location.replace('http://www.itcast.cn');
            // 页面刷新
            // location.reload(true);
        })
    </script>
</body>

navigator对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值。

下面代码判断是否为PC端 移动端

if ( (navigator. userAgent.match ( /(phonelpad|pod|iPhone liPodliosliPad
|Android /Mobile|BlackBerry| IEMobile |MQQBrowser| JUc| Fennec|wOSBrowser | BrowserNG| webosl Symbian 
|windows Phone)/i))) {
  window.location.href ='' //移动端
}else{
  window.location.href ='' //pc端
}
  

# history对象

window对象给我们提供了一个history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。

history对象方法 作用
back() 可以后台
forward() 前进功能
go(参数) 前进后退功能 参数如果是1 前进1个页面如果是-1 后退一个页面

page1 :forward.html

<body>
    <a href="back.html">Forward页面</a>
    <button>前进</button>
    <script>
        var btn = document.querySelector('button')
        btn.addEventListener('click',function(){
            history.forward();
            // history.go(1)
        })
    </script>
</body>

page2: back.html

<body>
    <a href="forward.html">back页面</a>
    <button>后退</button>
    <script>
        var btn = document.querySelector('button')
        btn.addEventListener('click',function(){
            history.back();
            // history.go(-1)
        })
    </script>
</body>

注意:需要先执行跳转,然后按钮才有效果

更新时间: 31 分钟