JS基礎:DOM(Document Object Model) & BOM(Browser Object Model)

JS 基礎:DOM & BOM

簡介

我們都知道 HTML、css、JavaScript 組合能生成千變萬化的頁面,今天我們來介紹瀏覽器環境下的 JS 對象。在瀏覽器環境下除了原生的標籤節(HTMLElement)點和樣式節點,瀏覽器還提供了兩種對象模型用來提供外部與原調用的接口,例如我們想調用瀏覽右鍵操作的列表、控制網頁內容的複製權限、對窗口歷史紀錄的回退等,這些都是 JS 原生能力以外由瀏覽器釋放出的接口,今天我們就介紹瀏覽器對象模型(BOM)和在此之下的文件對象模型(DOM),以及其內部的一些重要對象簡述。

參考

Window-MDNhttps://developer.mozilla.org/zh-TW/docs/Web/API/Window
Documnet-MDNhttps://developer.mozilla.org/zh-TW/docs/Web/API/Document
JavaScript入門系列:BOM和DOM筆記https://www.happycoding.today/posts/43
最全的DOM和BOM的解释分析https://juejin.im/post/5d7677b06fb9a06afd662d20

正文

Overview 總覽

瀏覽器提供的對象模型主要分成兩大體系:

  1. BOM(Browser Object Model)
  2. DOM(Document Object Model)

BOM(Browser Object Model)

BOM 模型最主要的對象就是 Window 對象,也就是我們在寫 js 時使用到的全局對象。我們可以把 Window 對象想像成他代表一個視窗的上下文環境,視窗等級下的重要屬性和操作都是透過這個對象向使用者釋出。

Window 對象

全局對象 Window 下存在一些重要屬性和方法,以下間單列出一些常用的方法,詳細屬性可以到參考一的 MDN 鏈結全面介紹 Window 對象的屬性和方法:

PropertyDescription
Window.document(readonly)指向 Document 對象
Window.history(readonly)指向 History 對象
Window.location指向 Location 對象
Window.navigator(readonly)指向 Navigator 對象
Window.screen(readonly)指向 Screen 對象
Window.localStorage(readonly)指向 Storage 對象
MethodsDescription
Window.addEventListener(type, listener, option)添加事件監聽器
Window.setTimeout(callback, delay[, args])設置定時器,延遲調用,調用邏輯詳見事件循環(Event Loop)
Window.clearTimeout(timeoutID)清除定時器
Window.setInterval(callback, delay[, args])設置定時循環,每隔一段時間重複調用,調用邏輯詳見事件循環(Event Loop)
Window.clearInterval(timeoutID)清除定時循環
MethodsDescription
Window.alert()彈出警告框
Window.confirm()彈出確認框
Window.focus()主動觸發視窗 focus
Window.blur()主動觸發視窗 blur
Window.open(url, name, windowFeature)開新分頁
Window.close()關閉分頁
Window.stop()停止頁面加載
Window.scrollBy(x, y)滑動窗口(相對偏移量)
Window.scrollTo([x, y] | option)滑動窗口(指定位置),behavior 可選值:smooth | instant

Window.document (Document 對象)

詳見下方 DOM

Window.history (History 對象)

History 對象保存當前頁面的瀏覽紀錄控制頁面的跳轉或回退,以下簡單介紹重要屬性和方法:

PropertyDescription
History.length(readonly)瀏覽紀錄深度,新開視窗的預設值為 1
History.scrollRestoration允許 web 應用顯示的指定默認的回滾行為(上一頁),可選值為 auto | manual
History.state(readonly)表示歷史紀錄棧頂(當前頁)的狀態
MethodsDescription
History.back()回退一頁,相當於 History.go(-1)
History.forward()回退一頁,相當於 History.go(1),以位於棧頂則無效
History.go(step)於瀏覽紀錄列表移動,step 表示前後移動偏移量
History.pushState(stateObj, title, url)向 History 紀錄壓棧
History.replaceState(stateObj, title, url)修改 History 的某條紀錄

Window.location (Location 對象)

Location 對象紀錄當前頁面的位置相關信息,包括url 相關信息附帶參數等,以下列出主要屬性和方法:

PropertyDescriptionSample
Location.hash路徑標示符,即 # 後的內容,可用來模擬路徑#/user/123
Location.hosthostname + portwww.google.com
Location.hostname主機名www.google.com
Location.href完整 urlhttps://www.google.com.tw/?gfe_rd=cr&ei=u2VgWb2LG8748Aec_57ACw
Location.pathurl 中 host 後面的路由部分/、/user
Location.port端口號80
Location.protocol通信協議http:
Location.search搜索參數,即 ? 後的內容?user=xxx&password=xxx
MethodsDescription
Location.assign(url)加載給定 url 的資源,會創建一個新的 History 紀錄
Location.reload(forceReload)重新加載資源,簡單來說就是刷新,參數決定是否強制刷新(false 時會先從緩存尋找資源)
Location.replace(url)替換當前 url,修改當前 History 紀錄而不會新增瀏覽紀錄
Location.toString()返回 Location 對象的 href

Window.navigator (Navigator 對象)

Navigator 對象表示用戶的狀態和標示,看了看屬性有點像瀏覽器相關狀態,包括瀏覽器名稱地理位置信息連網信息瀏覽器語言設定,有點抽象,以下列出重要屬性可能比較有感:

PropertyDescription
Navigator.appName(readonly)瀏覽器官方名稱
Navigator.appVersion(readonly)瀏覽器版本號
Navigator.battery(readonly)可能要用 getBattery 訪問,返回一個 BatteryManager,保存電池相關信息
Navigator.connection(readonly)保存一個 NetworkInformation 對象,保存當前網路連線相關信息
Navigator.cookieEnabled(readonly)保存當前 cookie 是否啟用
Navigator.geolocation(readonly)保存一個 Geolocation 對象,可訪問設備地理信息位置
Navigator.language(readonly)保存當前瀏覽器首要使用語言
Navigator.languages(readonly)保存當前瀏覽器已知語言列表
Navigator.onLine(readonly)保存當前瀏覽器是否連網
Navigator.serviceWorker保存一個 ServiceWorkerContainer,作為 ServiceWorker 池和控制管理模塊

Window.screen (Screen 對象)

Screen 對象表示螢幕窗口的相關信息,窗口的高度寬度像素等,以下列出重要屬性和方法:

PropertyDescription
Screen.height當前螢幕高度
Screen.width當前螢幕寬度
Screen.availHeight瀏覽器可用螢幕高度
Screen.availWidth瀏覽器可用螢幕寬度
Screen.orientation保存一個 ScreenOrientation 對象,紀錄當前螢幕的旋轉狀態
Screen.colorDepth表示當前瀏覽器色彩深度(?)
MethodsDescription
Screen.lockOrientation()鎖定屏幕旋轉
Screen.unlockOrientation()解鎖屏幕旋轉

Window.localStorage (Storage 對象)

Storage 可在本地以鍵值對的形式保存少量數據,為瀏覽器的本地緩存,不會隨著網頁的關閉清除:

PropertyDescription
Storage.length保存鍵值對的數量
MethodsDescription
Storage.key(val)返回第 val 個 key 的值
Storage.getItem(key)查找 key 對應的值
Storage.setItem(key, value)設置鍵值對(新增 or 修改)
Storage.removeItem(key)移除鍵值對
Storage.claer()清空 Storage 對象,移除所有鍵值對

DOM(Document Object Model)

BOM 模型裡面提供了大多數與瀏覽器相關的接口,有瀏覽紀錄相關的 History位置信息相關的 Location螢幕相關的 Screen狀態標示和位置相關的 Navigator,最後還有一個最重要的:文檔內容相關的 Document,也就是跟我們的網頁內容直接相關的對象,下列介紹 Document 的重要屬性和方法:

PropertyDescription
Document.characterSet(readonly)文檔的編碼類型
Document.doctype(readonly)紀錄文檔類型(HTML 不同版本擁有不同 doctype、可區分 XML)
Document.styleSheets(readonly)返回文檔的樣式表
Document.visibilityState(readonly)返回文檔隱藏狀態,可能值為:visible | hidden | prerender | unloaded
Document.title返回 HTML 文檔的標題(分頁名)
Document.head返回 HTML 文檔的 <head> 標籤
Document.body返回 HTML 文檔的 <body> 標籤
Document.cookiekey=value;key=value; ... 的形式返回當前 cookie 的字符串
Document.anchors返回文檔的錨點標籤(廢棄
Document.applets返回文檔的 applet 列表(廢棄
Document.forms(readonly)返回當前文檔內的所有 <form> 標籤
Document.embeds(readonly)返回當前文檔內的所有 <embed> 標籤
Document.images(readonly)返回當前文檔內的所有 <img> 標籤
Document.links(readonly)返回當前文檔內的所有 <a> 標籤
Document.scripts(readonly)返回當前文檔內的所有 <script> 標籤
Document.readyState(readonly)表示文檔的加載狀態,可能值有:loading | interactive | complete
  • 說明:嚴格來說我並沒有在 chrome 環境下找到 areas 和 layers 屬性,並不確定是 IE 專有還是已經被廢棄,所以開頭的圖中所示的 Layers[] 和 Areas[] 僅供參考

創建方法

Document 的屬性大多是一些內容,然而 Document 所有擁有的方法使用性更高,大多數 JS 框架如 Vue, React 在實現虛擬 DOM 的時候都借助到了 Document 對象主動創建和解析節點的能力

MethodsDescription
Document.createAttribute(attr)創建一個 Attr 屬性對象,用來添加在 Element 對象上
Document.createDocumentFragment()創建一個 DocumentFragment 文檔片段對象,相當於一個抽象的 Document 對象,插入真正的文檔後才會觸發頁面的重繪
Document.createElement(tagname)創建一個 HTMLElement 元素對象,可以是任意標籤對象(非標準標籤被定義成 HTMLUnknownElement 對象)
Document.createComment(data)創建一個 Comment 註解對象,相當於一個注釋標籤
Document.createTextNode(data)創建一個 Text 文本對象,為一個文字節點
Document.createEvent(type)創建一個 Event 對象,調用 Event.initEvent 之後可作為標籤事件掛載目標
Document.createRange()創建一個 Range 對象

查找方法

除了創建元素的方法之外,對於文檔結構中元素的查詢也是 JS 的 DOM 操作中非常重要的一塊

MethodsDescription
Document.getElementById(id)依據 id 查找元素,返回一個 Element 對象
Document.getElementsByClassName(className)依據 class 查找元素,返回一個 HTMLCollection 對象,類似於一個元素列表
Document.getElementsByTagName(tagName)依據標籤名查找元素,返回一個 HTMLCollection 對象
Document.querySelector(selector)使用選擇器查找元素,返回第一個 Element 對象
Document.querySelectorAll(selector)使用選擇器查找元素,返回一個 NodeList 對象,保存所有符合選擇器的節點

結語

本篇本來只打算介紹一下 BOM 和 DOM 的結構,但是自己在網上查了好幾輪之後發現,不簡單瀏覽一遍屬性和方法真的是會搞不清楚到底在幹嘛。本篇洋洋灑灑寫了很多,基本上都列在 API 列表裡面,本篇只是抽取一些比較常用或是常見的屬性和方法做介紹。由於一個人的時間精力有限,對於技術應該只需要了解結構和大概,操作細節大多是到應用的時候才慢慢熟練出來的。希望讀者能透過本篇簡單理解 Window 對象Document 對象到底保存了哪些東西,具備了什麼樣的能力,往後有需要的時候就能知道要查哪些對象和用法(例如定位相關就需要用到 Navigator 對象)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值