JavaScript Day 20. BOM 与 DOM

前端网页三大要素:JavaScript、HTML、CSS,HTML 负责整体资料与架构,CSS 负责网页样式外观的呈现,JavaScript 处理使用者行为与互动,而这些互动其实都是由浏览器提供,主要提供的方法则分为两种「BOM」及「DOM」。

JavaScript 由三部分构成:

  • JavaScript 核心 ( 以 ECMAScript 标准为基础 )
  • BOM ( Browser Object Model,浏览器物件模型 )
  • DOM ( Document Object Model,文件物件模型 )

大家熟悉的 API,就是透过 JavaScript 去呼叫 BOM 与 DON,让使用者得以与浏览器做互动。

BOM

究竟,什麽是 BOM 呢?BOM ( Browser Object Model,浏览器物件模型 ),是浏览器所有功能的核心,主要处理浏览器视窗和框架,不过通常浏览器特定的 JavaScript 扩充套件都被看做 BOM 的一部份,包括:弹出新的浏览器视窗、移动与关闭及调整浏览器视窗、提供 web 浏览器详细资讯的定位物件、对 cookie 的支援.....等等。

window 物件其实就是 BOM 的核心,window 物件提供的属性主要有 documentlocationnavigatorscreenhistory 以及 frames

在浏览器里的 window 物件扮演着两种角色:

  • ECMAScript 标准里的「全域物件」 (Global Object)

    凡是在「全域作用范围内」宣告的变数、物件、函式等等,都会自动变成「全域物件」,

    这样的变数便称它为「全域变数」,可以使用 window.xxx 的方式抓取。

  • JavaScript 用来与浏览器沟通的窗口

    指的是 alert()blur()close()open() 等等我们所看到的 window 方法,就是窗口。

全域变数范例,var a = 5 这个全域变数,可以透过 window 抓取

var a = 5;
console.log( window.a );    // 5

在「全域作用范围」宣告全域变数无法使用 delete 来移除,必须直接透过 window

// 无法使用 delete 来移除
var dog = 8;
console.log( window.dog ); // 8

delete window.dog; // false
console.log(window.dog); // 8

// 直接透过 window 来移除
window.dog = 8;
console.log(window.dog); // 8

delete window.dog; // true
console.log(window.dog); // undefined

由於 BOM 的 window 包含了 documentwindow 物件的属性和方法是可以直接使用及运作的,因此可以直接使用 window 物件的 document 属性,因为 document 物件又是 DOM 的根节点。可以说,BOM 包含了 DOM(物件),浏览器提供访问的是 BOM 物件,从 BOM 物件在访问到 DOM 物件,因此 JavaScript 可以操作浏览器以及读取浏览器的文件。


DOM

接着聊聊 DOM,DOM ( Document Object Model,文件物件模型 ),是一个以树状结构来表示 HTML 文件的模型,而组合起来的树状图,我们称之为「DOM Tree」。这边这一行看起来可能还没有办法马上理解,所以这里直接范例:

<html xmlns="" xml:lang="en">
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
		<title>DOM</title>
	</head>
	<body>
		<h2><a href="http://www.baidu.com">javascript DOM</a></h2>
		<p>对HTML元素进行操作,可新增、改变或移除css样式等</p>
		<ul>
			<li>Javascript</li>
			<li>DOM</li>
			<li>CSS</li>
		</ul>
	</body>
</html>

HTML 可以说是由节点构成的集合,我们将 HTML 程序码分解为 DOM 节点层次图:

  • 元素节点:上面范例中 、、 等都是元素节点,也是标签。
  • 文字节点:向使用者展示的内容,如 中的 JavaScript、DOM、CSS 等文字。
  • 属性节点:元素属性,如 标签的连结属性 href="http://xxxx.xxxx.com"。

由上面的说明可以知道,一个节点就是一个标签,JavaScript 就可以藉由 DOM API 去存取并改变 HTML 架构及互动方法,底下归纳 BOM 与 DOM 的分别:

  • BOM / JavaScript 与浏览器沟通的窗口,不涉及网页内容。
  • DOM / JavaScript 用来控制网页的节点与内容的标准。

取得 DOM 原型物件

参考开发者,透过 JavaScript 取得 DOM API 的写法:

// 根据传入的值,找到 DOM 中 id 为 'xxx' 的元素。
document.getElementById('xxx');

// 针对给定的 tag 名称,回传所有符合条件的 NodeList 物件
document.getElementsByTagName('xxx');

// 针对给定的 class 名称,回传所有符合条件的 NodeList 物件。
document.getElementsByClassName('xxx');

// 针对给定的 Selector 条件,回传第一个 或 所有符合条件的 NodeList。
document.querySelector('xxx');
document.querySelectorAll('xxx');

参考资料:

重新认识 JavaScript: Day 11 前端工程师的主战场:浏览器里的 JavaScript
JavaScript入门系列:BOM和DOM笔记
javascript学习笔记(三)BOM和DOM详解


<<:  予焦啦!Golang 当中的讯号(signal)机制

>>:  【心得】 会让人晕3D的transform

#8-选单华丽开起来!超简单!(animation-delay)

昨天做完了会动的汉堡动画传送门 今天来开关侧边栏吧! 当然只要控制 width0 —> 100...

Dot NET Core Host - 运作概述图解

Net Core 为一跨平台的应用开发,其此框架上可以加上许多自制服务,称之为容器也不为过。 如果...

Day25-介接 API(三)Google Calendar(III)OAuth 凭证建立与用 Google Calendar API 建立 Google Meet 会议

大家好~ 今天来实作如何用 Google Calendar API 建立 Google Meet 会...

【Day 05】从零开始的 Line Chatbot-公开 APP 网址

昨天稍微简介了一下 ngrok 在做甚麽,今天我们要让我们的 Line Channel 公开,这个 ...

[Day 21] Mattermost - RSS

Mattermost RSS 当你使用过Mattermost一段时间後,想试着使用RSS订阅一些像是...