BOM-篇
1. BOM 概述
1.1 什麼是 BOM
- BOM(Browser Object Model) 即
瀏覽器物件模型
,它提供了獨立於內容而與瀏覽器視窗進行互動的物件
,其核心的物件是window
- BOM 由一些列相關的物件構成,並且每個物件都提供了很多方法與屬性
BOM 缺乏標準
,JS語法的標準化組織是ECMA
, DOM的標準化組織是W3C
, BOM最初是Netscape瀏覽器標準的一部分
1.2 BOM 的構成
- BOM 比 DOM 更大,
它包含 DOM
window
物件是瀏覽器頂級物件,它具有雙重角色:
a. 它是JS訪問瀏覽器視窗的一個介面
b. 它是一個全域性物件
。定義在全域性作用域中的變數
、函式
都會變成window物件的屬性和方法
,在呼叫的時候
可以省略window
。前面學習的對話方塊都屬於window
物件的方法,如:alert()
、prompt()
等
注意:
window 下的一個特殊屬性: window.name
2. window物件常見的事件
2.1 視窗(頁面)載入事件
1. window.onload
事件
window.onload
是視窗(頁面)載入事件,當文件內容(影像、指令碼檔案、CSS檔案)完全載入完成會觸發該事件,
然後呼叫處理函式- 有了
window.onload
就可以把JS程式碼寫在頁面元素的上方,因為onload是等頁面內容全部載入完畢,再去執行處理函式 window.onload
傳統註冊方式只能寫一次,如果寫多個,會以最後一個window.onload
為準,如果使用addEventListener
註冊事件則沒有限制
window.onload = function () {
}
// 或者
window.addEventListener('load', function () {
})
2. document.DOMContentLoaded
事件
document.DOMContentLoaded
事件,當DOM載入完成就會觸發,不用等圖片
、CSS
、flash
等,載入速度比onload
更快- IE9 以上才支援
- 如果頁面圖片很多的話,等
onload
觸發可能時間會較長,影響使用者體驗,此時使用DOMContentloaded
可以讓使用者提前與網
頁互動,提高使用者體驗
2.2 調整視窗大小事件
window.onresize
是調整視窗大小載入事件,當視窗大小發生變化時就會觸發
2.3 重新載入頁面事件
window.onpageshow
重新載入頁面時觸發onpageshow
與onload
的區別:
a.onload
在執行頁面的後退或前進的時候,如果網頁被快取了,就觸發不了(比如火狐瀏覽器)
b.onpageshow
在執行頁面的後退或前進的時候,不管網頁被有沒有被快取了,都會觸發onpageshow
事件物件中有個屬性persisted
可以判斷是不是快取的頁面觸發了事件,返回布林值
3. 定時器
3.1 兩種定時器
window
物件給我們提供了2個非常好用的方法-定時器:
setTimeout()
、setInterval()
3.2 setTimeout() 一次性定時器
setTimeout()
方法用於設定一個定時器,該定時器在定時器到期後執行呼叫函式
- 語法:
window.setTimeout(呼叫函式, [延遲的毫秒數])
- 在呼叫的時候可以省略
window
,延遲時間單位是毫秒,可以省略,如果省略預設的是0
//=====方式一======================================================
window.setTimeout(function () {
// 函式體
}, 2000)
// ====方式二======================================================
setTimeout(fn ,3000)
setTimeout('fn()', 3000) // 不提倡這種寫法
function fn () {
// 函式體
}
- 停止一次性定時器
a. 語法:window.clearTimeout(timeoutID)
停止定時器
b.引數:timeoutID
是定時器的識別符號(給定時器起的名字)
3.4 setInterval() 重複定時器
setInterval()
方法重複呼叫一個函式,每隔這個(延時)時間,就呼叫一次回撥函式- 語法:
window.setInterval(回撥函式,[間隔毫秒數])
- 停止定時器:
a. 語法:window.clearInterval(timeID)
b.timeID
是定時器的識別符號(給定時器起的名字)
3.5 定時器的 this 指向
- 一般情況下,this 在定義函式的時候,確定不了指向,只有在呼叫函式的的時候才能確定 。遵循誰呼叫,
this 就指向誰的原則 - 全域性作用域或者普通函式中的
this
指向全域性物件window
(定時器裡面的this指向window
)
4. JS執行機制
4.1 JS 是單執行緒
- JS語言的一大特點就是
單執行緒
,也就是說同一時間只能做一件事情
。 - 這是因為JS這門指令碼語言誕生的使命所致(
JS是為處理頁面中使用者的互動,以及操作DOM誕生的
)。 - 比如對某個DOM元素進行新增刪除操作,不能同時進行,應該
先新增後刪除
4.2 JS 單執行緒導致的問題
- 單執行緒就意味著,
所有任務需要排隊
,前一個任務結束,才會執行後一個任務。 - 這樣所導致的問題是:如果JS執行時間過長就會造成頁面渲染不連貫,導致頁面渲染載入阻塞的感覺
- 比如定時器的延遲時間,就需要等待
4.3 同步和非同步
- 為了解決單執行緒的問題,利用多核CPU的計算能力,HTML5 提出
Web Worker
標準,允許JS指令碼建立多個執行緒
。
於是JS出現了同步
和非同步
同步:
前一個任務執行完再執行後一個任務,程式的執行順序與任務的排列順序是一致的、同步的。非同步:
在做一件事情的時候,因為這件事情會花費很長時間,在做這件事情的同時,還可以去處理其它事情
。
4.4 同步任務
- 同步任務都在主執行緒上執行,形成一個
執行棧
4.5 非同步任務
- JS 的非同步是通過回撥函式實現的。
- 一般而言,非同步任務有以下
三種型別
:
a.普通事件
,如:click、resize等
b.資源載入
,如:load、error等
c.定時器
,setInterval、setTimeout等 - 非同步任務相關的回撥函式新增到
任務佇列中
(任務佇列也稱為訊息佇列)
4.6 JS執行機制
- 先執行
執行棧中的同步任務
- 非同步任務(
回撥函式
)放入任務佇列中 - 一旦執行棧中的所有同步任務執行完畢,系統會按次序讀取任務佇列中的非同步任務,於是被讀取的非同步任務結束等待狀態,
進入執行棧,開始執行,執行完之後,主執行緒再查詢任務佇列有沒有任務,有就取出來放到執行棧中執行 - 由於主執行緒不斷重複的
獲得任務、執行任務、再獲得任務、再執行
,所以這種機制被稱為事件迴圈(eventloop)
5. location 物件(操作URL的)
5.1 什麼是 location 物件
window
物件給我們提供了一個location屬性
用於獲取或設定窗體的URL
,並且可以用於解析URL
。因為這個屬性返回的
是一個物件,所以我們將這個屬性也稱為location物件
5.2 URL 是什麼
統一資源定位符(Uniform Resource Locator ,URL)
是網際網路上標準資源的地址。- 網際網路上的每個檔案都有一個唯一的
URL
,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它。 - URL的一般語法格式為:
格式一:protocol://host[:port]/path/[?query]#fragment
案例:http://www.itcast.cn/index.html?name=andy&age=18#link
5.3 location 物件的屬性
- 重點記住:
href
、search
5.4 location 物件的方法
assign()
和replace()
都是跳轉頁面- 不同之處在於
assign()
會記錄頁面的歷史記錄。而replace()
不會記錄歷史記錄,所以不能後退頁面 reload()
是重新整理頁面,reload(true)
加個引數true
為強制重新整理,強制重新整理會清除頁面快取
6. navigator 物件(識別客戶機裝置)
navigator 物件
包含有關瀏覽器的資訊,它有很多屬性
,我們常見的是userAgent
,該屬性可以返回由客戶機傳送至
伺服器的user-agent頭部的值
userAgent
屬性可以幫我們判斷客戶端是手機還是電腦
7. history物件(瀏覽器前進後退功能)
window
物件給我們提供了一個history
物件,與瀏覽器歷史記錄進行互動。該物件包含使用者(在瀏覽器視窗中)訪問
過的URL
history
物件一般在實際開發中比較少用,但是會在一些OA
辦公系統中見到
相關文章
- [-演算法篇-] 開篇前言演算法
- HTML篇HTML
- 測試提效篇: 個人工具篇
- Mongodb安裝篇+視覺化工具篇MongoDB視覺化
- Flutter學習篇(五)——路由剖析終篇Flutter路由
- Linux 效能優化之 CPU 篇 ----- 套路篇Linux優化
- PHP 轉 GO 篇 小插曲(環境篇)PHPGo
- PHP 轉 JAVA 篇 小插曲(環境篇)PHPJava
- Java反射詳解篇--一篇入魂Java反射
- 精通MySQL之索引篇,這篇注重練習!MySql索引
- 『高階篇』docker之CICD(終結篇)(44)Docker
- python 類篇Python
- 普通話篇
- 工具篇 - Carbon
- ElasticSearch(提高篇)Elasticsearch
- innodb索引篇索引
- 雜食篇
- leetcode開篇LeetCode
- 思路整理篇
- webpack – babel 篇WebBabel
- webpack - babel 篇WebBabel
- Dubbo 開篇
- HTML/CSS篇HTMLCSS
- LINUX篇-centosLinuxCentOS
- 完結篇
- MySQL 基礎篇需要注意的點(小白篇)MySql
- 一篇文章瞭解JsBridge之IOS篇JSiOS
- 自定義View事件篇進階篇(三)-CoordinatorLayout與BehaviorView事件
- Java進階篇 設計模式之十四 ----- 總結篇Java設計模式
- webpack配置(第四步:html篇(進階篇))WebHTML
- (Python篇)零基礎入門第三篇Python
- 迴圈(Java篇)Java
- 【一】開始篇
- 第十八篇
- Redis 入門篇Redis
- python:實戰篇Python
- PwnTheBox(Crypto篇)---Rsa
- RocketMQ - 理論篇MQ