此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
Navigation:navigate() 方法
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Navigation 接口的 navigate() 方法导航到特定的 URL,更新历史记录条目列表中提供的任何状态。
语法
navigate(url)
navigate(url, options)
参数
url-
要导航到的目标的 URL。请注意,当在另一个窗口的
navigation对象上调用navigate()时,URL 将相对于目标窗口的 URL 进行解析,而不是调用窗口的 URL。这与 History API 的行为相符,但与 Location API 的行为不符。 options可选-
包含以下属性的选项对象:
state可选-
开发者定义的信息,将在导航完成后存储在关联的
NavigationHistoryEntry中,可通过getState()检索。这可以是任何数据类型。例如,你可能希望存储页面访问次数以用于分析目的,或者存储 UI 状态详细信息,以便视图可以与用户上次离开时完全相同地显示。存储在state中的任何数据都必须是可结构化克隆的。 info可选-
开发者定义的信息,将传递给
navigate事件,可在NavigateEvent.info中获取。这可以是任何数据类型。例如,你可能希望根据导航方式(向左滑动、向右滑动或返回主页)以不同的动画显示新导航的内容。可以传入一个字符串来指示要使用哪种动画,该字符串可作为info选项传入。 history可选-
设置此导航的历史记录行为的枚举值。可用的值包括:
auto:默认值;通常会执行push导航,但在特殊情况下会执行replace导航(请参阅下面的NotSupportedError描述)。push:将会把新的NavigationHistoryEntry推送到历史记录条目列表中,或者在特殊情况下失败(参见下面的NotSupportedError描述)。replace:将替换当前的NavigationHistoryEntry。
返回值
包含以下属性的对象:
committed-
当可见 URL 发生改变并且新的
NavigationHistoryEntry被创建时被兑现的Promise。 finished-
当
intercept()处理器返回的所有 promise 都被兑现时被兑现的Promise。这相当于当navigatesuccess事件触发时,兑现NavigationTransition.finishedpromise。
如果导航由于某种原因失败,则这两个 promise 中的某一个会被拒绝。
异常
DataCloneErrorDOMException-
如果
state参数中包含不可结构化克隆的值,则抛出此异常。 SyntaxErrorDOMException-
如果
url参数不是合法的 URL,则抛出此异常。 NotSupportedErrorDOMException-
如果
history选项设置为push,并且以下任何特殊情况成立,则抛出此异常:- 浏览器当前正在显示初始的
about:blank文档。 url的协议是javascript。
- 浏览器当前正在显示初始的
示例
>设置主页按钮
function initHomeBtn() {
// 获取第一个加载条目的键,以便用户可以随时返回该视图。
const { key } = navigation.currentEntry;
backToHomeButton.onclick = () => {
navigation.traverseTo(key);
};
}
// 拦截导航事件(例如链接点击),并将其替换为单页导航
navigation.addEventListener("navigate", (event) => {
event.intercept({
async handler() {
// 导航到不同的视图,但"主页"按钮始终有效。
},
});
});
智能后退按钮
页面提供的"后退"按钮可以让你返回,即使在重新加载后,也可以通过检查以前的历史记录条目返回:
backButtonEl.addEventListener("click", () => {
if (
navigation.entries()[navigation.currentEntry.index - 1]?.url ===
"/product-listing"
) {
navigation.back();
} else {
// 如果用户通过其他方式到达此处,例如直接输入 URL:
navigation.navigate("/product-listing", { history: "replace" });
}
});
使用 info 和 state
async function navigateHandler() {
await navigation.navigate(url, {
info: { animation: "swipe-right" },
state: { infoPaneOpen: true },
}).finished;
// 更新应用程序状态
// ...
}
规范
| Specification |
|---|
| HTML> # dom-navigation-navigate-dev> |
浏览器兼容性
Loading...
参见
- 现代客户端路由:导航 API
- 导航 API 说明
- Domenic Denicola 的导航 API 在线演示