Navigation:navigate 事件

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

Navigation 介面的 navigate 事件在 任何型別的導航 啟動時觸發,允許您根據需要進行攔截。

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("navigate", (event) => { })

onnavigate = (event) => { }

事件型別

一個 NavigateEvent。繼承自 Event

Event NavigateEvent

示例

使用 intercept() 處理導航

js
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 可用之前,要實現類似的功能,您必須監聽連結上的所有 click 事件,執行 event.preventDefault(),執行相應的 History.pushState() 呼叫,然後根據新的 URL 設定頁面檢視。而且這不會處理所有導航 — 只會處理使用者發起的連結點選。

使用 scroll() 處理滾動

在這個攔截導航的例子中,handler() 函式首先獲取並渲染一些文章內容,然後獲取並渲染一些次要內容。一旦主要文章內容可用,立即將頁面滾動到該內容是有意義的,以便使用者可以與之互動,而不是等到次要內容也渲染完成。為了實現這一點,我們在兩者之間添加了一個 scroll() 呼叫。

js
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
# event-navigate

瀏覽器相容性

另見