js bom

bom全称浏览器模型。js通过api与浏览器进行交互,浏览器也提供一些组件协助js工作。

目录

一,script标签引入网络js脚本时的协议问题

1.1 http形式

1.2 https形式

1.3 跟随域名

二,srcipt标签的工作原理

2.1 浏览器的工作原理

2.2 将script标签放入head中还是body尾巴处?

2.3 defer解决阻塞效应

2.4 async解决阻塞效应

2.5 defer与async的优先级与如何选择?

三,回流和重绘

3.1 造成回流的原因

3.2 造成重绘的原因

3.3 优化技巧

四,定时器

4.1 setTimeout

4.2 setInterval

五,防抖debounce

5.1 防抖debounce简介

5.2 防抖的实际案例

六,节流throtle

6.1 节流简介

6.2 节流实际案例

七,window对象常用属性

7.1 window.srceenX&window.srceenY

7.2 window.innerHeight&window.innerWidth

7.3 window.outHeight&window.outWidth

7.4 window.scrollX&window.scrollY

八,window对象常用方法

九,navigator对象

9.1 navigator对象的属性大全

十,Screen对象

十一,history对象

十二,cookie对象


一,script标签引入网络js脚本时的协议问题

1.1 http形式

        不安全但是快速。

<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"> </script>

1.2 https形式

        安全但是不快速。

<script src="http://unpkg.com/swiper@8/swiper-bundle.min.js"> </script>

1.3 跟随域名

        将协议省略,则加载时自动使用当前主域名的加载协议。

<script src="//unpkg.com/swiper@8/swiper-bundle.min.js"> </script>

二,srcipt标签的工作原理

2.1 浏览器的工作原理

        当打开一个网页,浏览器就会通过http协议请求各种js文件,图片资源……但是最先请求的必然是html文档。浏览器将html文档从服务器下载到内存,然后立即对其进行解析渲染,注意:即使html文档并没有全部下载完毕也会进行解析渲染。

        当解析html文档时,浏览器遇见script标签就会暂停渲染html的dom树,而是等待script中src中引入的js脚本下载完毕并执行完毕。当js文本加载并执行完毕,再继续解析html进行网页渲染。

2.2 将script标签放入head中还是body尾巴处?

        放入body尾巴处,浏览器会将html解析完毕再执行js脚本,这会导致网页频繁的回流重绘,让人觉得浏览器让电脑变卡变慢。

        放入head中,如果遇见js的url地址反应太慢,会使网页一篇空白,让人觉得网站太垃圾。这就是所谓的阻塞效应,即js解析引擎一直pending,网页渲染引擎没有cpu算力导致网页空白或者不响应。

        所以应该理智选择放在哪里。

2.3 defer解决阻塞效应

        在srcipt标签中加入defer属性。在等待js脚本下载的过程中,也会并发解析html网页,等到网页解析完毕再回头执行js。

<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js" defer> </script>

2.4 async解决阻塞效应

         在srcipt标签中加入async属性。在等待js脚本下载的过程中,也会并发解析html网页,等到js脚本下载完毕,则立刻暂停网页渲染去执行js脚本,完成之后再渲染网页。

<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js" async> </script>

2.5 defer与async的优先级与如何选择?

        如果defer与async同时添加,async会生效。由于async是异步的,如果一个网页之中的js脚本存在前后依赖关系,组推荐使用defer。

三,回流和重绘

        将dom树转换为网页布局称为布局流。布局显示到页面的过程叫做绘制,会产生阻塞效应。css样式表和js脚本操作dom树都会使dom树发生改变,从而导致网页的布局变化。

        重绘:html标签由于样式改变(颜色,形状……)从而再页面上的显示发生变化。

        回流:html标签之间的位置,可见度发生变化,进而导致页面整体布局发生变化。

        应当尽量避免重绘与回流。且回流必定导致重绘。

3.1 造成回流的原因

3.2 造成重绘的原因

3.3 优化技巧

        重绘是依据dom树重新渲染网页。

四,定时器

        定时器类似于闹钟,在规定时间之后再去做某事。定时器一般绑定在window上,即浏览器上。可以认为定时器就是浏览器的一个组件。

4.1 setTimeout

        n = setTimeout(handler,timeot)。handler表示定时完毕之后需要做的事;timeout表示定时时长。n代表定时器返回时提供的编号。

        如果定时器作为的是某对象的方法,则对象里面的定时器的this指向全局window,而不是调用者。这是因为浏览器会对js脚本中的定时器进行统一管理。

        取消定时器的方法:clearTimeout(id),id为定时器序号。

4.2 setInterval

        n = setInterval(),与setTimeout类似,不过会重复执行指定事件。

五,防抖debounce

5.1 防抖debounce简介

        防抖用于处理频率过高的问题,比如某个事件被频繁触发导致cpu爆满,用户体验差关闭了当前页面。

        比如页面右侧滚动条上下滑动的时候会导致页面回流,如果用户一直拖着滚动条上下移动就会导致cpu风扇开始转。这个时候就要对用户进行限制,比如一秒才出发一次回流,这就十分的nice,这种做法就叫做防抖。

        防抖的主要思路就是:对某个比较消耗性能的事件用定时器进行限制,在规定时间内假如事件一直被触发则让其失效,只有当事件触发条件停止之后才进行执行。

        注意:定时器的生成一般由事件触发,由于定时器生成太多也会耗性能 ,故应该想办法只生成一个定时器。

5.2 防抖的实际案例

        只有当鼠标滚轮停止滚动300ms之后才触发事件。这里用到了事件机制,即:事件函数只提交注册一次,当事件被触发,执行的是事件函数的代码体,而不是重复注册事件。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            height: 400px;
            background-color: aqua;
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <script>
        fn = () => console.log(document.documentElement.scrollTop);
        function debounce(fn, timeout) {
            var timer = null;
            function timerWithargs() {
                if (timer) {
                    clearTimeout(timer);
                }
                timer = setTimeout(fn, timeout)
            }
            return timerWithargs
        }
        window.onscroll = debounce(fn, 300); //timer = setTimeout(fn, timeout)会被执行
    </script>
</body>
</html>

六,节流throtle

6.1 节流简介

        与防抖类似。禁止某事件频发触发消耗资源。

        主要思路:类似与技能冷却,使用之后一定时间内无法在执行。只需要使用一个flag来确定是否在冷却时间内即可。

6.2 节流实际案例

        300ms执行一次。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            height: 400px;
            background-color: aqua;
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <script>
        fn = () => console.log(document.documentElement.scrollTop);

        function debounce(fn, timeout) {
            var valid = true;
            //注意第一次必须要生成一个定时器,所以要确保if的条件与初始valid值的关系
            function timerWithargs() {
                if (!valid) {
                    //这里的作用相当于让函数pending,则valid为false,return结束函数
                    return false
                }
                valid = false
                timer = setTimeout(() => {
                    fn();
                    valid = true;//300ms后置valid为true,pending失效,随机生成一个定时器
                }, timeout)
            }
            return timerWithargs
        }
        window.onscroll = debounce(fn, 300);
    </script>
</body>

</html>

七,window对象常用属性

        window对象指的是当前的浏览器窗口,是最高一层的对象,其他对象都是他的下属。

7.1 window.srceenX&window.srceenY

        表示浏览器窗口左上角举例电脑屏幕的x,y距离。单位px。

7.2 window.innerHeight&window.innerWidth

        表示当前页面的可见高度和宽度,即viewport。注意:包括滚动条的高度和宽度。单位px。

7.3 window.outHeight&window.outWidth

        表示当前浏览器的窗口大小,包括菜单栏和状态栏。

7.4 window.scrollX&window.scrollY

        表示当前页面上下左右滚动的像素值。

八,window对象常用方法

        有alert(),prompt(),confirm(),他们都用于弹出提示框与用户交互。prompt可以输入参数提交;confirm可以确定和取消并给确定和取消绑定事件。

        open(url)可以直接打开一个新的浏览器窗口。

九,navigator对象

        一般指window.navigator,包含浏览器和系统信息。

9.1 navigator对象的属性大全

        appCodeName:返回浏览器的代码名称;appName:返回浏览器的名称;appVersion:返回浏览器的版本信息;cookieEnabled:确定是否在浏览器中启用了cookie;geolocation:返回可用于定位用户位置的Geolocation对象;language:返回浏览器的语言;onLine:确定浏览器是否在线 ;platform:返回编译浏览器的平台;product:返回浏览器的引擎名称;userAgent:返回浏览器发送给服务器的用户代理标头。Plugins:显示浏览器插件。

十,Screen对象

        提供显示设备的信息。比如分辨率,浏览器窗口占用的屏幕范围。分辨率:window.screen;屏幕高度和宽度:window.screen.height/width;浏览器所占屏幕高度和宽度:window.screen.availHeight,window.screen.availWidth;屏幕位深:window.screen.pixelDepth;横评还是竖屏:window.screen.orientation。

十一,history对象

        记录某次访问过程中的浏览记录。试下网页向前向后具有记忆性的跳转。

        history.length:记录的网页个数;history.back:网页回退。history.forward:网页向前。history.go(页面序号):跳转到指定页面。

十二,cookie对象

        cookie是存在浏览器本地的记录文件,每个cookie的大小不能超过4kb,浏览器每次想服务器发送请求就会自动带上这个文件。

        cookie的目的是区分用户,保存状态信息。常用于session对话管理,偏好记录,用户行为分析。

        每一条cookie记录具有:name,value,expired,domain,path等参数。具体如下图:

        expire:session表示临时会话。为utc格式。document.cookie="key=value;expirees=utc时间"。详细内容在这里:地址

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值