NavigateEvent
NavigateEvent 介面是 Navigation API 的一個介面,它是 navigate 事件的事件物件。當 任何型別的導航 被髮起時(這包括使用 History API 的功能,例如 History.go()),該事件就會觸發。NavigateEvent 提供了訪問有關該導航的資訊,並允許開發者攔截和控制導航的處理。
建構函式
-
建立一個新的
NavigateEvent物件例項。
例項屬性
繼承其父級 Event 的屬性。
canInterceptRead only Experimental-
如果導航可以被攔截,則返回
true,否則返回false(例如,您無法攔截跨域導航)。 destinationRead only Experimental-
返回一個
NavigationDestination物件,該物件表示正在導航到的目標。 downloadRequestRead only Experimental-
在下載導航的情況下(例如,帶有
download屬性的<a>或<area>元素),返回被請求下載的檔名,否則返回null。 formDataRead only Experimental-
在
POST表單提交的情況下,返回表示提交資料的FormData物件,否則返回null。 hashChangeRead only Experimental-
如果導航是片段導航(即導航到同一文件中的片段識別符號),則返回
true,否則返回false。 hasUAVisualTransitionRead only Experimental-
如果在分發此事件之前,使用者代理為此導航執行了視覺過渡,則返回
true,否則返回false。 infoRead only Experimental-
返回由發起導航操作(例如
Navigation.back()或Navigation.navigate())傳遞的info資料值,如果未傳遞info資料,則返回undefined。 -
返回導航的型別 —
push、reload、replace或traverse。 signalRead only Experimental-
返回一個
AbortSignal,如果導航被取消(例如,使用者點選了瀏覽器的“停止”按鈕,或者開始了另一個導航並因此取消了當前導航),該訊號將變為中止狀態。 sourceElementRead only Experimental-
當導航是由一個元素髮起的(例如點選連結時),則返回一個表示發起元素的
Element物件。 userInitiatedRead only Experimental-
如果導航是由使用者發起的(例如,透過點選連結、提交表單或按下瀏覽器的“後退/前進”按鈕),則返回
true,否則返回false。
例項方法
繼承其父級 Event 的方法。
intercept()Experimental-
攔截此導航,將其轉換為同文檔導航到
destinationURL。它可以接受一個處理函式來定義導航處理行為,以及focusReset和scroll選項來按需控制行為。 scroll()Experimental-
如果要在導航處理完成之前觸發瀏覽器驅動的滾動行為,可以呼叫此方法來手動觸發它。
示例
使用 intercept() 處理導航
navigation.addEventListener("navigate", (event) => {
// Exit early if this navigation shouldn't be intercepted,
// e.g. if the navigation is cross-origin, or a download request
if (shouldNotIntercept(event)) return;
const url = new URL(event.destination.url);
if (url.pathname.startsWith("/articles/")) {
event.intercept({
async handler() {
// The URL has already changed, so show a placeholder while
// fetching the new content, such as a spinner or loading page
renderArticlePagePlaceholder();
// Fetch the new content and display when ready
const articleContent = await getArticleContent(url.pathname);
renderArticlePage(articleContent);
},
});
}
});
注意: 在 Navigation API 可用之前,要實現類似的功能,您需要監聽連結上的所有點選事件,執行 e.preventDefault(),執行適當的 History.pushState() 呼叫,然後根據新 URL 設定頁面檢視。而且這不會處理所有導航 — 只會處理使用者發起的連結點選。
使用 scroll() 處理滾動
在這個攔截導航的例子中,handler() 函式首先獲取並渲染一些文章內容,然後獲取並渲染一些次要內容。一旦主要文章內容可用,立即將頁面滾動到該內容是有意義的,以便使用者可以與之互動,而不是等到次要內容也渲染完成。為了實現這一點,我們在兩者之間添加了一個 scroll() 呼叫。
navigation.addEventListener("navigate", (event) => {
if (shouldNotIntercept(navigateEvent)) return;
const url = new URL(event.destination.url);
if (url.pathname.startsWith("/articles/")) {
event.intercept({
async handler() {
const articleContent = await getArticleContent(url.pathname);
renderArticlePage(articleContent);
event.scroll();
const secondaryContent = await getSecondaryContent(url.pathname);
addSecondaryContent(secondaryContent);
},
});
}
});
規範
| 規範 |
|---|
| HTML # the-navigateevent-interface |
瀏覽器相容性
載入中…