导航:navigate() 方法
navigate()
是 Navigation
接口的方法,用于导航到特定的 URL,并更新历史记录条目列表中提供的任何状态。
语法
navigate(url)
navigate(url, options)
参数
url
-
要导航到的目标 URL。请注意,当在另一个窗口的
navigation
对象上调用navigate()
时,URL 将相对于目标窗口的 URL 解析,而不是调用窗口的 URL。这与 历史记录 API 的行为一致,但与 位置 API 的行为不一致。 options
可选-
包含以下属性的选项对象
state
可选-
开发人员定义的信息,将在导航完成后存储在关联的
NavigationHistoryEntry
中,可以通过getState()
检索。这可以是任何数据类型。例如,您可能希望存储页面访问次数以用于分析目的,或存储 UI 状态详细信息,以便可以完全按照用户上次离开时的状态显示视图。存储在state
中的任何数据都必须是 结构化可克隆的。 info
可选-
开发人员定义的信息,将传递给
navigate
事件,在NavigateEvent.info
中可用。这可以是任何数据类型。例如,您可能希望根据导航到的方式(向左滑动、向右滑动或返回主页)以不同的动画显示新导航的内容。指示要使用哪个动画的字符串可以作为info
传递。 history
可选-
设置此导航历史行为的枚举值。可用值如下:
auto
:默认值;通常执行push
导航,但在特殊情况下会执行replace
导航(请参阅下面的NotSupportedError
说明)。push
:将新的NavigationHistoryEntry
推送到条目列表中,或在特殊情况下失败(请参阅下面的NotSupportedError
说明)。replace
:将替换当前的NavigationHistoryEntry
。
返回值
具有以下属性的对象
committed
-
一个
Promise
,当可见 URL 更改且创建了新的NavigationHistoryEntry
时,此 Promise 将完成。 finished
-
一个
Promise
,当intercept()
处理程序返回的所有 Promise 都已完成时,此 Promise 将完成。这等效于NavigationTransition.finished
Promise 完成时,以及navigatesuccess
事件触发时。
如果导航由于某种原因失败,则这两个 Promise 之一将被拒绝。
异常
DataCloneError
DOMException
-
如果
state
参数中包含的值不是结构化可克隆的,则会抛出此异常。 SyntaxError
DOMException
-
如果
url
参数不是有效的 URL,则会抛出此异常。 NotSupportedError
DOMException
-
如果
history
选项设置为push
,并且以下任何特殊情况为真,则会抛出此异常- 浏览器当前显示初始
about:blank
文档。 url
的方案是javascript
。
- 浏览器当前显示初始
示例
设置主页按钮
function initHomeBtn() {
// Get the key of the first loaded entry
// so the user can always go back to this view.
const { key } = navigation.currentEntry;
backToHomeButton.onclick = () => {
navigation.traverseTo(key);
};
}
// Intercept navigate events, such as link clicks, and
// replace them with single-page navigations
navigation.addEventListener("navigate", (event) => {
event.intercept({
async handler() {
// Navigate to a different view,
// but the "home" button will always work.
},
});
});
智能后退按钮
页面提供的“后退”按钮即使在重新加载后也可以带您返回,方法是检查先前的历史记录条目
backButtonEl.addEventListener("click", () => {
if (
navigation.entries()[navigation.currentEntry.index - 1]?.url ===
"/product-listing"
) {
navigation.back();
} else {
// If the user arrived here in some other way
// e.g. by typing the URL directly:
navigation.navigate("/product-listing", { history: "replace" });
}
});
使用 info 和 state
async function navigateHandler() {
await navigation.navigate(url, {
info: { animation: "swipe-right" },
state: { infoPaneOpen: true },
}).finished;
// Update application state
// ...
}
规范
规范 |
---|
HTML 标准 # dom-navigation-navigate-dev |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。
另请参阅
- 现代客户端路由:导航 API
- 导航 API 说明
- Domenic Denicola 的 导航 API 实时演示