虽然 ECMAScript 把浏览器对象模型(BOM,Browser Object Model)描述为JavaScript 的核心,但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。多年来,BOM 是在缺乏规范的背景下发展起来的,因此既充满乐趣又问题多多。毕竟,浏览器开发商都按照自己的意愿来为它添砖加瓦。最终,浏览器实现之间共通的部分成为了事实标准,为 Web 开发提供了浏览器间互操作的基础。HTML5 规范中有一部分涵盖了 BOM 的主要内容,因为 W3C 希望将JavaScript 在浏览器中最基础的部分标准化。

1.window对象

BOM 的核心是 window 对象,表示浏览器的实例。window 对象在浏览器中有两重身份,一个是ECMAScript 中的 Global 对象,另一个就是浏览器窗口的 JavaScript 接口。这意味着网页中定义的所有对象、变量和函数都以 window 作为其 Global 对象,都可以访问其上定义全局方法。

1.1.Global作用域

因为 window 对象被复用为 ECMAScript 的 Global 对象,所以通过 var 声明的所有全局变量和函数都会变成 window 对象的属性和方法。比如:

<script>var name = 'zhangsan';var sayName = function () {console.log(this.name);}console.log(window.name); //zhangsansayName();  //zhangsanwindow.sayName(); //zhangsan
</script>

这里,变量 name 和函数 sayName()被定义在全局作用域中,它们自动成为了 window 对象的成员。因此,变量 name 可以通过 window.name 来访问,而函数 sayName()也可以通过 window.sayName()来访问。因为 sayName()存在于全局作用域,this.name 映射到 window.name,所以就可以显示正确的结果了。

1.2.Window窗口

1.2.1.窗口位置

screenLeft和screenTop

属性返回窗口相对于屏幕的X和Y坐标。(火狐浏览器不支持)

screenX和screenY

属性返回窗口相对于屏幕的X和Y坐标。(ie浏览器不支持,火狐可以使用此属性)

pageXOffset

设置或返回当前页面相对于窗口显示区左上角的 X 位置。

pageYOffset

设置或返回当前页面相对于窗口显示区左上角的 Y 位置。

注意:IE8及更早IE版本不支持该属性,但可以使用 "document.body.scrollLeft" 和 "document.body.scrollTop" 属性 。

1.2.2.窗口大小

innerWidth

页面视图区的宽度

innerHeight

页面视图区的高度

outerWidth

浏览器窗口的宽度

outerHeight

浏览器窗口的高度

注意:所有主流浏览器都支持innerWidth,innerHeight,outerWidth,outerHeight 属性。注意:IE8及更早IE版本不支持这些属性。

1.2.3.screen对象

屏幕总宽度/高度(像素单位):

screen.width

screen.height

可用宽度/高度(像素单位):

screen.availWidth

screen.availHeight

颜色深度:

screen.colorDepth

颜色分辨率:

screen.pixelDepth

1.3.Window open()

window.open()方法可以用于导航到指定 URL,也可以用于打开新浏览器窗口。这个方法接收 4个参数:要加载的 URL、目标窗口、特性字符串和表示新窗口在浏览器历史记录中是否替代当前加载页面的布尔值。通常,调用这个方法时只传前 3 个参数,最后一个参数只有在不打开新窗口时才会使用。

语法

window.open(URL,name,specs,replace)

参数

URL

可选。打开指定的页面的URL。如果没有指定URL,打开一个新的空白窗口。

name

可选。指定target属性或窗口的名称。支持以下值:

  • _blank - URL加载到一个新的窗口。这是默认

  • _parent - URL加载到父框架

  • _self - URL替换当前页面

  • _top - URL替换任何可加载的框架集

  • name - 窗口名称

specs

可选。一个逗号分隔的项目列表。支持以下值:

hannelmode=yes|no|1|0 是否要在影院模式显示 window。默认是没有的。仅限IE浏览器
directories=yes|no|1|0 是否添加目录按钮。默认是肯定的。仅限IE浏览器
fullscreen=yes|no|1|0 浏览器是否显示全屏模式。默认是没有的。在全屏模式下的 window,还必须在影院模式。仅限IE浏览器
height=pixels 窗口的高度。最小.值为100
left=pixels 该窗口的左侧位置
location=yes|no|1|0 是否显示地址字段.默认值是yes
menubar=yes|no|1|0 是否显示菜单栏.默认值是yes
resizable=yes|no|1|0 是否可调整窗口大小.默认值是yes
scrollbars=yes|no|1|0 是否显示滚动条.默认值是yes
status=yes|no|1|0 是否要添加一个状态栏.默认值是yes
titlebar=yes|no|1|0 是否显示标题栏.被忽略,除非调用HTML应用程序或一个值得信赖的对话框.默认值是yes
toolbar=yes|no|1|0 是否显示浏览器工具栏.默认值是yes
top=pixels 窗口顶部的位置.仅限IE浏览器
width=pixels 窗口的宽度.最小.值为100

replace

Optional.Specifies规定了装载到窗口的 URL 是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。支持下面的值:

  • true - URL 替换浏览历史中的当前条目。

  • false - URL 在浏览历史中创建新的条目。

<button onclick="openWindow()">打开新窗口</button>
<button onclick="closeWindow()">关闭窗口</button>
<script>function openWindow() {// 设置一个全局变量接收新窗口的打开w = window.open('https://www.baidu.com', '_blank', 'width=600,height=600', 'false');// 调整窗口大小 浏览器窗口的新高度和新宽度w.resizeTo(400,400);// 移动窗体 接受的是新位置的x和y坐标值w.moveTo(100, 100);}function closeWindow() {// 关闭窗口w.close()}
</script>

1.4.系统对话框

使用 alert()、confirm()和 prompt()方法,可以让浏览器调用系统对话框向用户显示消息。这些对话框与浏览器中显示的网页无关,而且也不包含 HTML。它们的外观由操作系统或者浏览器决定,无法使用 CSS 设置。此外,这些对话框都是同步的模态对话框,即在它们显示的时候,代码会停止执行,在它们消失以后,代码才会恢复执行。

alert()

alert()接收一个要显示给用户的字符串。与 console.log 可以接收任意数量的参数且能一次性打印这些参数不同,alert()只接收一个参数。调用 alert()时,传入的字符串会显示在一个系统对话框中。对话框只有一个“OK”(确定)按钮。如果传给 alert()的参数不是一个原始字符串,则会调用这个值的 toString()方法将其转换为字符串。

警告框(alert)通常用于向用户显示一些他们无法控制的消息,比如报错。用户唯一的选择就是在看到警告框之后把它关闭。

alert('我是警告框')

confirm()

确认框通过调用 confirm()来显示。确认框跟警告框类似,都会向用户显示消息。但不同之处在于,确认框有两个按钮:“Cancel”(取消)和“OK”(确定)。用户通过单击不同的按钮表明希望接下来执行什么操作。比如,confirm("你确定吗?");

要知道用户单击了 OK 按钮还是 Cancel 按钮,可以判断 confirm()方法的返回值:true 表示单击了 OK 按钮,false 表示单击了 Cancel 按钮或者通过单击某一角上的 X 图标关闭了确认框。确认框的典型用法如下所示:

<script>var result = confirm('你确定吗?');if (result) {console.log('确定');}else{console.log('取消');}
</script>

prompt()

提示框,通过调用 prompt()方法来显示。提示框的用途是提示用户输入消息。除了 OK 和 Cancel 按钮,提示框还会显示一个文本框,让用户输入内容。prompt()方法接收两个参数:要显示给用户的文本,以及文本框的默认值(可以是空字符串)。调用 prompt("你叫什么名字?"),如果用户单击了 OK 按钮,则 prompt()会返回文本框中的值。如果用户单击了 Cancel 按钮,或者对话框被关闭,则 prompt()会返回 null。

<script>var result = prompt("你叫什么名字?");if (result) {console.log(result);}else{console.log('取消');}
</script>

1.5.location

location对象是最有用的BOM对象之一,提供了与当前窗口中加载的文档有关的信息,还提供一些导航功能。

location是个神奇的对象,既是window的对象也是document的对象。经过我们的对比发现,直接使用location对象也可以。

<script>console.log(window.location === document.location); //trueconsole.log(location === document.location);  //trueconsole.log(location === window.location);    //true
</script>

属性

host 返回服务器名称和端口号 hostname 返回不带端口号的服务器名称 href 返回当前加载页面的完整URL pathname 返回URL的目录和文件名 port 返回URL中指定的端口号 protocol 返回页面使用的协议 search 返回URL的查询字符串。这个字符串以问号开头

方法

assign()

传递一个url参数,打开新url,并在浏览记录中生成一条记录。

replace()

参数为一个url,结果会导致浏览器位置改变,但不会在历史记录中生成新记录。

reload()

重新加载当前显示的页面,参数可以为boolean类型,默认为false,表示以最有效方式重新加载,可能从缓存中直接加载。如果参数为true,强制从服务器中重新加载。

<button>跳转页面</button>
<button>替换页面</button>
<button>刷新页面</button>
<script>var btn = document.getElementsByTagName('button');btn[0].onclick = function () {location.assign('./test2.html')}btn[1].onclick = function () {location.replace('./test2.html')}btn[2].onclick = function () {location.reload()}
</script>

1.6.history对象

该对象保存着用户上网的历史记录。出于安全方面的考虑,开发人员无法得知用户浏览过的URL,不过借由用户访问过的页面列表,同样可以在不知道实际URL的情况下实现后退前进,注意: 没有应用于History对象的公开标准,不过所有浏览器都支持该对象。

length

返回历史列表中的网址数 注意:Internet Explorer和Opera从0开始,而Firefox、Chrome和Safari从1开始。

back()

加载 history 列表中的前一个 URL

forward()

加载 history 列表中的下一个 URL

go()

加载 history 列表中的某个具体页面,负数表示向后跳转,正数表示向前跳转。

1.7.间歇调用和超时调用

javascript是单线程语言,但是可以通过超时值和间歇时间来调度代码在特定时刻执行。

setTimeout()

该方法返回一个数值ID,表示超时调用,这个超时调用ID是计划执行代码的唯一标识符通过它来取消超时调用。可以通过clearTimeout(ID);

参数:

1.要执行的代码 2.以毫秒表示的时间。

例如在1秒后执行输出语句

<script>var id = setTimeout(() => {console.log('Hello World');}, 1000);console.log(id);// 清除超时调用clearTimeout(id);
</script>

setInterval()

按照指定的时间间隔重复执行代码,直到间歇调用被取消或页面被卸载。调用该方法也会返回一个间歇调用ID,该ID可以用户在将来某个时刻取消间歇调用。

参数:

1.要执行的代码 2.以毫秒表示的时间。

如动态显示时间

<script>var div = document.createElement('div');// 间歇调用var id = setInterval(() => {div.innerHTML = new Date().toLocaleString();}, 1000);document.body.appendChild(div);// 清除计时器clearInterval(id);
</script>

1.8.防抖和节流

在进行窗口的操作或者输入框操作时,如果事件处理函数用的频率无限制,会加重浏览器和服务器的负担,此时我们就可以用防抖(debounce)和节流(throttle)的方式来减少调用频率,同时又不影响实际效果。

1.8.1.函数防抖

单位时间内,频繁触发一个事件,以最后一次触发为准。 防抖的实现: 1.声明一个全部变量存储定时器ID。 2.每一次触发交互的时候,先清除上一次的定时器,然后开启本次定时器。

<input type="text" name="" id="inp">
<script>//输入框事件//声明全局变量存储定时器IDvar timeID = null// 获取输入框节点var inp = document.getElementById('inp')// 输入框输入事件inp.oninput = function () {//1.先清除之前的定时器clearTimeout(timeID)//2.开启本次定时器timeID = setTimeout(() => {console.log(`输入的内容是${this.value}`)}, 500)}
</script>

1.8.2.函数节流

单位时间内,频繁触发一个事件,只会触发一次。 节流的实现: 1.声明一个全局变量存储触发事件。 2.每一次触发事件,获取当前时间。 3.判断当前时间与上一次触发事件,是否超过了间隔。 4.如果超过间隔时间,则执行事件处理代码,然后存储本次触发的时间。

<button id="btn">点我呀</button>
<script>//声明一个全局变量存储触发时间let lastTime = null// 获取按钮节点var btn = document.getElementById('btn')//页面滚动事件btn.onclick = function () {//1.每一次触发 先获取本次时间戳let currentTime = Date.now()//2.判断当前时间 与 上次触发时间 是否超过间隔if (currentTime - lastTime >= 3000) {console.log(this.innerHTML)//3.存储本次的触发时间lastTime = currentTime}}
</script>

BOM基础教程解析!菜鸟必看,建议收藏相关推荐

  1. JavaScript基础教程新手入门必看

    对前端稍微有点了解的初学者都知道,JavaScript是必不可少的工具.毫不夸张的说,大部分网页都使用了JavaScript,想要成为一个优秀的前端工程师,做出漂亮令用户满意的网页,熟练掌握JavaS ...

  2. linux 批处理教程,最全的批处理入门教程,菜鸟必看

    1.这是一篇技术教程,我会用很简单的文字表达清楚自己的意思,你要你识字就能看懂,就能学到知识.写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如果爱可以让事情变的更简单,那么就让它简单吧!看 ...

  3. 新手如何快速入门Python(菜鸟必看篇)

    学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层.虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如 ...

  4. JavaEE入门级别最全教程4--初学者必看

    健康万岁,商业无罪,大家好我是Laity也是你们的J哥. 一.JavaWeb介绍 使用Java技术来解决相关web互联网领域的技术栈(其实就是开发网站) Java 的 api齐全,历史悠久.(后台开发 ...

  5. 电脑音频服务未运行怎么解决_电脑故障维修技巧教程:新手必看的修电脑技巧!...

    日常生活工作中,我们的电脑总会出现各种各样的问题,如果掌握了一定的通用修电脑技巧,除了可以解决问题,说不定还能得到帮女神修电脑的机会,俗话说的好,电脑修的好,对象少不了!电脑故障判断一般本着先&quo ...

  6. C#(Csharp)基础教程(上)(菜鸟教程笔记)

    博客已更新:C#(Csharp)基础教程(中)(菜鸟教程笔记) 内容包括:判断.循环.封装.方法.可空类型.数组.字符串.结构体.枚举. 目录 1. C# 及其开发环境简介 1.1 C# 概述 1.2 ...

  7. 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D

    转自:https://www.cnblogs.com/neverdie/p/How_To_Learn_Unity3D.html(http://www.cnblogs.com/neverdie/) Un ...

  8. 黑客零起步——菜鸟必看!

    黑客零起步--菜鸟必看! 一.<名词介绍> 首先给大家介绍点名词: 1.肉鸡 2.木马 3.病毒 4.后门 5.CRACK 6.漏洞 7.端口 8.权限 好了,下面我来详细介绍下. 1.肉 ...

  9. 【PMP考试扫盲】超详细的PMP项目管理入门基础知识,考证必看

    我今年 6 月刚考过 PMP,发现很多小伙伴都对 PMP 还不了解,这篇文章就是对 PMP 基础知识的一个全面解答,文章有点长,先给大家上个目录,方便大家直接查看对应内容~ 目录 [PMP考试扫盲]超 ...

最新文章

  1. Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用1
  2. 3、C语言面试笔试--控制结构
  3. 针对《等保2.0》要求的云上最佳实践——网络安全篇
  4. 兴趣记忆法(1)顺口溜记忆
  5. 快速入门 TensorFlow2 模型部署
  6. 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)
  7. 剑指offer——面试题5:从尾到头打印链表
  8. iOS 绝对值方法
  9. linux桌面系统开启wifi,8089B开启Wifi的方法(默认的红旗linux系统)
  10. 掌握这些,你也可以轻松扒谱(上)
  11. 东鹏饮料,有点“上头”
  12. [转]优秀程序设计的Kiss原则(keep it simple,stupid)
  13. 台式计算机没有声音怎么办,台式机没有声音怎么办_台式机声音修复方法-太平洋IT百科...
  14. C# 将dataTable中的数据导出到excel表中
  15. Linux下WebLogic12安装
  16. 黄金分割法_python
  17. std::upper_bound与std::lower_bound
  18. humanoid 动画鬼畜的问题
  19. Windows Server 2022 无线网卡装不上驱动
  20. 拼多多引流产品卖什么好?拼多多卖什么好?

热门文章

  1. 使用 git rebase 命令合并分支
  2. 分享思路:Python+Spark招聘爬虫可视化系统 招聘数据分析 Hadoop职位可视化 大数据毕业设计 51job数据分析(可选加推荐算法)
  3. 使用spring整合quartz进行定时器调用(图文案例)
  4. j散度matlab,利用Matlab绘制梯度图、散度图、旋度图。.doc
  5. 自动驾驶全球布局(3)传统汽车厂商
  6. 自动保存微信的小视频
  7. 博图V15自动化许可证管理器打不开_@大学生:机械设计制造及其自动化专业电脑选购指南...
  8. CSS Flex布局 (弹性布局)(圣杯布局)
  9. WLAN1:AC6005组网配置实验
  10. RGB图片转换为灰度图片,以及图像和numpy矩阵之间的转换