BOM

什么是BOM

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

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

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

 

 

 BOM的构成

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

1.它是JS访问浏览器窗口的一个接口

2.它是一个全局对象,定义在全局作用域中的变量,函数都会变成window对象的属性和方法

在调用的时候可以省略window,前面学习的对话框都属于window对象方法,如alert(),prompt()等

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

窗口加载事件

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

注意:

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

2.window.onload 传统注册事件方式只能写一次,如果有多个,会以最后一个window.onload为准

 

 

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

如果页面的图片很多的话、从用户访问到onload触发可能需要较长的时间、交互效果就不能实现、必然影响用户的体验、此时用DOMContentLoaded事件比较合适

调整窗口大小事件

 

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

注意:

1.只要窗口大小发生像素变化、就会触发这个事件

2.我们经常利用这个事件完成响应式布局、window.innerWidth当前屏幕的宽度

 

setTimeout()定时器

 

 

 setTimeout()方法用于设置一个定时器、该定时器在定时器到期后执行调用函数

注意:

1.window可以省略

2.这个调用函数可以直接写函数、或者写函数名或者采取字符串 '函数名()'三种形式、第三种不推荐

3.延迟的毫秒数省略默认是0、如果写,必须是毫秒

4.因为定时器可能有很多、所以我们经常个定时器赋值一个标识符

 setTimeout()这个调用函数我们也称为回调函数callback

普通函数是按照代码顺序直接调用

而这个函数、需要等待事件、事件到了才去调用这个函数、因此称为回调函数

简单理解:回调、就是回头调用的意思、上一件事干完、再回头再调用这个函数

以前我们讲的 element.onclick = function(){} 或者 element.addEventListner("click",fn)里面的 函数也是回调函数

停止 setTimeout()定时器

 

 setInterval()定时器

 

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

注意:

1.window可以省略

2.这个调用函数可以直接写函数、或者写函数名或者采取字符串 '函数名()'三种形式、第三种不推荐

3.延迟的毫秒数省略默认是0、如果写,必须是毫秒

4.因为定时器可能有很多、所以我们经常个定时器赋值一个标识符

停止setInterval()定时器

 

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

注意:

1.window可以省略

2.里面的参数就是定时器的标识符

 

JS执行机制

JS是单线程

JavaScript语言的一大特点就是单线程,也就是说、同一个时间只能做一件事、这是因为JavaScript这门脚本语言诞生的使命所致——JavaScript是为处理页面中用户的交互、以及操作DOM而诞生的、比如我们对某个DOM元素进行添加和删除操作、不能同时进行、应该先进行添加、之后再删除

 

单线程就意味着、所有任务需要排队、前一个任务结束、才会执行后一个任务、这样所导致的问题是:如果JS执行的时间过长、这样就会造成页面的渲染不连贯、导致页面渲染加载阻塞的感觉

 

同步和异步

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

 

同步

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

异步

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

 

他们的本质区别:这条流水线各个流程的执行顺序不同

 

同步任务

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

异步任务

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

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

1、普通事件、如click、resize等

2、资源加载、如load、error等

3、定时器、包括setInterval、setTimeout等

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

 

JS执行机制

1.先执行执行栈中的同步任务

2.异步任务(回调函数)放入任务队列中

3.一旦执行栈中的所有同步任务执行完毕、系统就会按次序读取任务队列中的异步任务、于是被读取的异步任务结束等待状态、进入执行栈、开始执行

 

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

 

location对象

什么是location对象

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

URL

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

URL的一般语法格式为:

 

 重点记住:href和search

location对象的方法

 

 navigator对象

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

下面的前端代码可以判断用户那个终端打开页面、实现跳转

 

 history对象

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

 

 元素偏移量offset系列

offset概述

offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等

  • 获得元素距离带有定位父元素的位置
  • 获得元素自身的大小(宽度高度)
  • 注意:返回的数值都不带单位

 

 

 

 元素可视区 client 系列

client 翻译过来就是客户端、我们使用 client 系列的相关属性来获取元素可视区的相关信息、通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等

 

 元素滚动 scroll 系列

元素 scroll 系列属性

scroll 翻译过来就是滚动的,我们使用scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等

 

 

页面被卷去的头部

如果浏览器的高(或宽)度不足以显示整个页面时、会自动出现滚动条、当滚动条向下滚动时、页面上面被隐藏掉的高度、我们就称为页面被卷去的头部、滚动条在滚动时会触发onscroll事件

三大系列总结

 

 他们主要用法:

1.offset系列经常用于获得元素位置  offsetLeft offsetTop

2.client经常用于获取元素大小 clientWidth  clientHeight

3.scroll经常用于获取滚动距离 scrollTop  scrollLeft

4.注意页面滚动的距离通过 window.pageXoffset 获得

 

mouseenter 鼠标事件

  • 当鼠标移动到元素上时就会触发 mouseenter事件
  • 类似mouseover,他们两者之间的差别是
  • mouseover 鼠标经过自身盒子会触发、经过子盒子还会触发,mouseenter 只会自身盒子触发
  • 之所以这样、就是因为mouseenter不会冒泡

 

动画实现原理

核心原理:通过定时器 setnterval()不断移动盒子位置

实现步骤:

1.获得盒子当前位置

2.让盒子在当前位置加上1个移动距离

3.利用定时器不断重复这个操作

4.加一个结束定时器的条件

5.注意此元素需要添加定位、才能使用element.style.left

动画函数简单封装

注意函数需要传递2个参数、动画对象移动到的距离

动画函数给不同元素记录不同定时器

如果多个元素都使用这个动画函数、每次都要var声明定时器,我们给不同的元素使用不同的定时器(自己专门用自己的定时器)

核心原理:利用js是一门动态语言、可以很方便的给当前对象添加属性

 

触屏事件概述

移动端浏览器兼容性较好,我们不需要考虑以前JS的兼容性问题,可以放心的使用原生JS书写效果,但是移动端也有自己独特的地方,比如触屏事件touch(也称触摸事件),Android Q和IOS都有

touch对象代表一个触摸点,触摸点可能是一根手指,也可能是一根触摸笔,触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作

 

 触摸事件对象(TouchEvent)

TouchEvent是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件,这类事件用于描述一个或多个触点,使开发者可以检测触点的移动、触点的增加和减少、等等

'touchstart、touchmove、touchend三个事件都会各自有事件对象

 

 因为平时我们都是给元素注册触摸事件、所以重点记住targetTocuhes

移动端拖动元素

1.touchstart、touchmove、touchend可以实现拖动元素

2.但是拖动元素需要当前手指的坐标值 我们可以使用 targetTouches【0】里面的pageX和pageY

3.移动端拖动的原理:手指移动中、计算出手指移动的距离、然后用盒子原来的位置+手指移动的距离

4.手指移动的距离:手指滑动中的位置减去、手指刚开始触摸的位置

拖动元素三步曲:

(1)触摸元素touchstart:获取手指初始坐标、同时获得盒子原来的位置

(2)移动手指touchmove:计算手指的滑动距离、并且移动盒子

(3)离开手指touchend:

注意:手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动e.prevenDefault();

 

click延时解决方案

移动端click事件会有300ms的延时,原因是移动端屏幕双击会缩放(double tap to zoom)页面

posted @ 2022-04-24 08:57  奥摩前端  阅读(139)  评论(0编辑  收藏  举报