NavigateEvent

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

NavigateEvent 接口是 Navigation API 的一个接口,它是 navigate 事件的事件对象。当 任何类型的导航 被发起时(这包括使用 History API 的功能,例如 History.go()),该事件就会触发。NavigateEvent 提供了访问有关该导航的信息,并允许开发者拦截和控制导航的处理。

Event NavigateEvent

构造函数

创建一个新的 NavigateEvent 对象实例。

实例属性

继承其父级 Event 的属性。

canIntercept Read only Experimental

如果导航可以被拦截,则返回 true,否则返回 false(例如,您无法拦截跨域导航)。

destination Read only Experimental

返回一个 NavigationDestination 对象,该对象表示正在导航到的目标。

downloadRequest Read only Experimental

在下载导航的情况下(例如,带有 download 属性的 <a><area> 元素),返回被请求下载的文件名,否则返回 null

formData Read only Experimental

POST 表单提交的情况下,返回表示提交数据的 FormData 对象,否则返回 null

hashChange Read only Experimental

如果导航是片段导航(即导航到同一文档中的片段标识符),则返回 true,否则返回 false

hasUAVisualTransition Read only Experimental

如果在分发此事件之前,用户代理为此导航执行了视觉过渡,则返回 true,否则返回 false

info Read only Experimental

返回由发起导航操作(例如 Navigation.back()Navigation.navigate())传递的 info 数据值,如果未传递 info 数据,则返回 undefined

返回导航的类型 — pushreloadreplacetraverse

signal Read only Experimental

返回一个 AbortSignal,如果导航被取消(例如,用户点击了浏览器的“停止”按钮,或者开始了另一个导航并因此取消了当前导航),该信号将变为中止状态。

sourceElement Read only Experimental

当导航是由一个元素发起的(例如点击链接时),则返回一个表示发起元素的 Element 对象。

userInitiated Read only Experimental

如果导航是由用户发起的(例如,通过点击链接、提交表单或按下浏览器的“后退/前进”按钮),则返回 true,否则返回 false

实例方法

继承其父级 Event 的方法。

intercept() Experimental

拦截此导航,将其转换为同文档导航到 destination URL。它可以接受一个处理函数来定义导航处理行为,以及 focusResetscroll 选项来按需控制行为。

scroll() Experimental

如果要在导航处理完成之前触发浏览器驱动的滚动行为,可以调用此方法来手动触发它。

示例

使用 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 可用之前,要实现类似的功能,您需要监听链接上的所有点击事件,运行 e.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
# the-navigateevent-interface

浏览器兼容性

另见