說明
使用 chrome.webNavigation
API 接收有關導航要求狀態的通知。
權限
webNavigation
資訊清單
所有 chrome.webNavigation
方法和事件都必須在擴充功能資訊清單中聲明「webNavigation」權限。例如:
{
"name": "My extension",
...
"permissions": [
"webNavigation"
],
...
}
活動順序
如果瀏覽作業順利完成,系統會依下列順序觸發事件:
onBeforeNavigate -> onCommitted -> [onDOMContentLoaded] -> onCompleted
如果程序期間發生任何錯誤,就會導致 onErrorOccurred
事件。如果是特定導覽,onErrorOccurred
後不會再觸發任何事件。
如果導覽框架包含子框架,系統會先觸發其 onCommitted
,再觸發任何子項的 onBeforeNavigate
;而系統會在觸發所有子項的 onCompleted
後,再觸發 onCompleted
。
如果影格的參照片段有所變更,系統會觸發 onReferenceFragmentUpdated
事件。這個事件可在 onDOMContentLoaded
之後的任何時間觸發,包括 onCompleted
之後。
如果使用 History API 修改影格的狀態 (例如使用 history.pushState()
),系統會觸發 onHistoryStateUpdated
事件。這個事件可在 onDOMContentLoaded
之後的任何時間觸發。
如果瀏覽作業從往返快取還原網頁,系統就不會觸發 onDOMContentLoaded
事件。由於網頁首次造訪時內容已載入完畢,因此不會觸發事件。
如果導覽是透過 Chrome 即時或即時網頁觸發,系統會將完全載入的網頁換入目前的分頁。在這種情況下,系統會觸發 onTabReplaced
事件。
與 webRequest 事件的關係
webRequest API 的事件與 webNavigation API 的事件之間沒有定義順序。對於已開始新導覽的影格,系統可能仍會收到 webRequest 事件,或者導覽只會在網路資源完全載入後才繼續。
一般來說,webNavigation 事件與 UI 中顯示的導覽狀態密切相關,而 webRequest 事件則對應於網路堆疊的狀態,使用者通常無法瞭解這類狀態。
分頁 ID
並非所有導覽分頁都對應至 Chrome 使用者介面中的實際分頁,例如預先算繪的分頁。您無法透過分頁 API 存取這類分頁,也無法透過 webNavigation.getFrame
或 webNavigation.getAllFrames
要求這類分頁的相關資訊。這類分頁切換進來後,系統會觸發 onTabReplaced
事件,您就能透過這些 API 存取分頁。
時間戳記
請注意,作業系統處理不同 Chrome 程序的某些技術異常情況,可能會導致瀏覽器本身和擴充功能程序之間的時鐘發生偏差。也就是說,WebNavigation 事件的 timeStamp
屬性只保證內部一致。比較兩個事件時,您會得到正確的偏移量,但如果將事件與擴充功能內的目前時間 (例如透過 (new Date()).getTime()
) 進行比較,可能會得到非預期的結果。
影格 ID
您可以透過框架 ID 識別分頁中的框架。主頁框的頁框 ID 一律為 0,子頁框的 ID 則為正數。在影格中建構文件後,文件生命週期內的影格 ID 會保持不變。自 Chrome 49 起,這個 ID 在影格的生命週期內 (跨多個導覽) 也會保持不變。
由於 Chrome 採用多重程序,分頁可能會使用不同的程序來轉譯網頁的來源和目的地。因此,如果導覽作業是在新程序中進行,您可能會收到新舊網頁的事件,直到新導覽作業完成 (也就是為新的主要框架傳送 onCommitted
事件為止)。換句話說,您可能會有多個待處理的 webNavigation 事件序列,且具有相同的 frameId
。序列可以透過 processId
鍵區分。
另請注意,在暫時載入期間,程序可能會切換數次。如果載入作業重新導向至其他網站,就會發生這種情況。在這種情況下,您會重複收到 onBeforeNavigate
和 onErrorOccurred
事件,直到收到最終的 onCommitted
事件為止。
擴充功能還有一個問題,就是影格的生命週期。框架會代管與已提交網址相關聯的文件。文件可能會變更 (例如透過導覽),但 frameId 不會變更,因此很難將特定文件中發生的事件與 frameId 建立關聯。我們將推出 documentId 的概念,這是每個文件的專屬 ID。如果導覽框架並開啟新文件,ID 就會變更。這個欄位不會變更,因此有助於判斷網頁何時會變更生命週期狀態 (預先算繪/有效/已快取)。
轉場類型和限定詞
webNavigation API 的 onCommitted
事件具有 transitionType
和 transitionQualifiers
屬性。轉場效果類型與歷史記錄 API 中使用的類型相同,說明瀏覽器導覽至這個特定網址的方式。此外,系統還會傳回多個轉場限定符,進一步定義導覽。
轉換限定詞如下:
轉換資格 | 說明 |
---|---|
「client_redirect」 | 導覽期間,網頁上的 JavaScript 或中繼重新整理標記造成一或多個重新導向。 |
「server_redirect」 | 導覽期間,伺服器傳送的 HTTP 標頭導致一或多個重新導向。 |
「forward_back」 | 使用者使用「前進」或「返回」按鈕啟動導覽。 |
「from_address_bar」 | 使用者從網址列 (又稱「多功能方塊」) 啟動導覽。 |
範例
如要試用這個 API,請從 chrome-extension-samples 存放區安裝 webNavigation API 範例。
類型
TransitionQualifier
列舉
「client_redirect」
「server_redirect」
「forward_back」
「from_address_bar」
TransitionType
導覽原因。系統會使用與 History API 中定義相同的轉場效果類型。這些轉換類型與歷史記錄 API 中定義的類型相同,但為了回溯相容性,以 "start_page"
取代 "auto_toplevel"
。
列舉
「link」
「typed」
「auto_bookmark」
「auto_subframe」
「manual_subframe」
「generated」
「start_page」
「form_submit」
「reload」
「keyword」
「keyword_generated」
方法
getAllFrames()
chrome.webNavigation.getAllFrames(
details: object,
callback?: function,
): Promise<object[] | undefined>
擷取指定分頁的所有框架資訊。
參數
-
詳細資料
物件
要從中擷取所有影格的分頁相關資訊。
-
tabId
數字
分頁的 ID。
-
-
callback
函式 選用
callback
參數如下:(details?: object[]) => void
-
詳細資料
object[] optional
指定分頁中的影格清單,如果指定的分頁 ID 無效,則為空值。
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
errorOccurred
布林值
如果這個影格中的上次導覽因發生錯誤而中斷 (即觸發 onErrorOccurred 事件),則為 True。
-
frameId
數字
影格的 ID。0 表示這是主要影格;正值表示子影格的 ID。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
網址
字串
目前與這個影格相關聯的網址。
-
-
傳回
-
Promise<object[] | undefined>
Chrome 93 以上版本只有資訊清單 V3 以上版本支援 Promise,其他平台則需使用回呼。
getFrame()
chrome.webNavigation.getFrame(
details: object,
callback?: function,
): Promise<object | undefined>
擷取指定影格的相關資訊。頁框是指網頁的 <iframe> 或 <frame>,並由分頁 ID 和頁框 ID 識別。
參數
-
詳細資料
物件
要擷取資訊的影格相關資訊。
-
documentId
字串 選填
Chrome 106 以上版本文件的 UUID。如果提供 frameId 和/或 tabId,系統會驗證這些 ID 是否與提供的文件 ID 所找到的文件相符。
-
frameId
號碼 選填
指定分頁中的框架 ID。
-
processId
號碼 選填
Chrome 49 版起已淘汰現在系統會以分頁 ID 和框架 ID 識別框架,不再需要程序 ID,因此會忽略該 ID。
執行這個分頁的算繪器程序 ID。
-
tabId
號碼 選填
影格所在分頁的 ID。
-
-
callback
函式 選用
callback
參數如下:(details?: object) => void
-
詳細資料
object 選填
所要求影格的相關資訊。如果指定的影格 ID 和/或分頁 ID 無效,則為空值。
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
errorOccurred
布林值
如果這個影格中的上次導覽因發生錯誤而中斷 (即觸發 onErrorOccurred 事件),則為 True。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
父項框架的 ID,如果是主要框架,則為
-1
。 -
網址
字串
如果 frameId 所識別的影格曾出現在指定分頁中,則為目前與該影格相關聯的網址。網址與特定 frameId 相關聯,並不代表對應的影格仍然存在。
-
-
傳回
-
Promise<object | undefined>
Chrome 93 以上版本只有資訊清單 V3 以上版本支援 Promise,其他平台則需使用回呼。
事件
onBeforeNavigate
chrome.webNavigation.onBeforeNavigate.addListener(
callback: function,
filters?: object,
)
即將發生導覽時觸發。
參數
-
函式
callback
參數如下:(details: object) => void
-
物件
-
Chrome 106 以上版本
文件所處的生命週期。
-
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。特定分頁和程序中的影格 ID 不得重複。
-
Chrome 106 以上版本
發生導覽的影格類型。
-
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
數字
父項框架的 ID,如果是主要框架,則為
-1
。 -
數字
Chrome 50 版起已淘汰由於要等到 onCommit 才會知道要算繪結果文件的程序,因此這個事件不再設定 processId。
值為 -1。
-
數字
即將發生導覽的索引標籤 ID。
-
數字
瀏覽器即將開始導覽的時間,以 Epoch 紀元時間起算的毫秒數表示。
-
字串
-
-
-
object 選填
-
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onCommitted
chrome.webNavigation.onCommitted.addListener(
callback: function,
filters?: object,
)
導覽作業完成時觸發。文件 (以及參照的資源,例如圖片和子框架) 可能仍在下載中,但至少已從伺服器收到部分文件,且瀏覽器已決定切換至新文件。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
導覽的提交時間,以自 Epoch 紀元時間起的毫秒為單位。
-
transitionQualifiers
轉換限定詞清單。
-
transitionType
導覽原因。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onCompleted
chrome.webNavigation.onCompleted.addListener(
callback: function,
filters?: object,
)
文件 (包括參照的資源) 完全載入及初始化時觸發。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
文件完成載入的時間,以自 Epoch 紀元時間算起的毫秒數表示。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onCreatedNavigationTarget
chrome.webNavigation.onCreatedNavigationTarget.addListener(
callback: function,
filters?: object,
)
建立新視窗或現有視窗中的新分頁,以代管導覽時觸發。
參數
-
函式
callback
參數如下:(details: object) => void
-
物件
-
數字
導覽觸發所在頁框的 ID,其中包含 sourceTabId。0 表示主要框架。
-
數字
執行來源影格算繪器的程序 ID。
-
數字
觸發導覽的索引標籤 ID。
-
數字
開啟網址的分頁 ID
-
數字
瀏覽器即將建立新檢視區塊的時間,以從 Epoch 紀元時間算起的毫秒數表示。
-
字串
要在新視窗中開啟的網址。
-
-
-
object 選填
-
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onDOMContentLoaded
chrome.webNavigation.onDOMContentLoaded.addListener(
callback: function,
filters?: object,
)
網頁的 DOM 完全建構完成時觸發,但參照的資源可能尚未載入完畢。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
網頁 DOM 完全建構完成的時間,以自 Epoch 紀元時間算起的毫秒數表示。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onErrorOccurred
chrome.webNavigation.onErrorOccurred.addListener(
callback: function,
filters?: object,
)
發生錯誤並中止導覽時觸發。如果發生網路錯誤,或是使用者中止導覽,就可能發生這種情況。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
錯誤
字串
錯誤說明。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
Chrome 50 版起已淘汰這個事件的 processId 已不再設定。
值為 -1。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
發生錯誤的時間,以 Epoch 紀元時間起算的毫秒數表示。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onHistoryStateUpdated
chrome.webNavigation.onHistoryStateUpdated.addListener(
callback: function,
filters?: object,
)
當影格的記錄更新為新網址時觸發。該框架的所有後續事件都會使用更新後的網址。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
導覽的提交時間,以自 Epoch 紀元時間起的毫秒為單位。
-
transitionQualifiers
轉換限定詞清單。
-
transitionType
導覽原因。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onReferenceFragmentUpdated
chrome.webNavigation.onReferenceFragmentUpdated.addListener(
callback: function,
filters?: object,
)
在更新影格的參照片段時觸發。該框架的所有後續事件都會使用更新後的網址。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
documentId
字串
Chrome 106 以上版本載入文件的 UUID。
-
documentLifecycleChrome 106 以上版本
文件所處的生命週期。
-
frameId
數字
0 表示導覽發生在分頁內容視窗中;正值表示導覽發生在子框架中。框架 ID 在分頁中不得重複。
-
frameTypeChrome 106 以上版本
發生導覽的影格類型。
-
parentDocumentId
字串 選填
Chrome 106 以上版本擁有這個影格的父項文件的 UUID。如果沒有上層項目,則不會設定這個值。
-
parentFrameId
數字
Chrome 74 以上版本父項框架的 ID,如果是主要框架,則為
-1
。 -
processId
數字
執行這個影格的算繪器程序 ID。
-
tabId
數字
發生導覽的索引標籤 ID。
-
timeStamp
數字
導覽的提交時間,以自 Epoch 紀元時間起的毫秒為單位。
-
transitionQualifiers
轉換限定詞清單。
-
transitionType
導覽原因。
-
網址
字串
-
-
-
篩選器
object 選填
-
網址
網址必須符合的條件。系統會忽略這個事件的 UrlFilter「schemes」和「ports」欄位。
-
onTabReplaced
chrome.webNavigation.onTabReplaced.addListener(
callback: function,
)
當分頁的內容替換為其他分頁 (通常是先前預先算繪的分頁) 時,就會觸發這個事件。
參數
-
callback
函式
callback
參數如下:(details: object) => void
-
詳細資料
物件
-
replacedTabId
數字
遭取代的分頁 ID。
-
tabId
數字
取代舊分頁的分頁 ID。
-
timeStamp
數字
更換時間,以 Epoch 紀元時間起算的毫秒數表示。
-
-