跳转到主内容

导航历史

概览

NavigationHistory 类允许你管理 Electron 应用的浏览历史并与之交互。 这个强大的功能可让您为用户创建直观的导航体验。

访问 NavigationHistory

导航历史记录存储在每个 WebContents 的实例中。 要访问 NavigationHistory 类的具体实例,请使用 WebContents 类的 contents.navigationHistory 实例属性

const { BrowserWindow } = require('electron')

const mainWindow = new BrowserWindow()
const { navigationHistory } = mainWindow.webContents

通过历史记录导航

轻松实现前进和后退导航:

// 后退
if (navigationHistory.canGoBack()) {
navigationHistory.goBack()
}

// 前进
if (navigationHistory.canGoForward()) {
navigationHistory.goForward()
}

访问历史记录条目

检索并显示用户浏览历史:

const entries = navigationHistory.getAllEntries()

entries.forEach((entry) => {
console.log(`${entry.title}: ${entry.url}`)
})

每项导航条目对应着一个具体的页面。 索引系统依顺序排列:

  • 索引 0:代表最早访问的页面。
  • 索引 N:代表最近访问的页面。

导航到特定条目

允许用户跳转到他们浏览历史上的任何一点:

// 如果索引有效,则导航到历史记录中的第5个条目
navigationHistory.goToIndex(4)

// 导航至当前位置向前的第2个条目
if (navigationHistory.canGoToOffset(2)) {
navigationHistory.goToOffset(2)
}

恢复历史记录

有一种常见的操作流程是你想要恢复一个 webContents 的历史 - 例如实现“撤销关闭标签页”的功能。 要想这样做,你可以调用 navigationHistory.restree({ index, entries })。 这将会恢复 webContents 的导航历史记录以及在该历史记录中的位置,意味着 goBack()goForward() 将如预期那样在栈中导航。

const firstWindow = new BrowserWindow()

// Later, you want a second window to have the same history and navigation position
async function restore () {
const entries = firstWindow.webContents.navigationHistory.getAllEntries()
const index = firstWindow.webContents.navigationHistory.getActiveIndex()

const secondWindow = new BrowserWindow()
await secondWindow.webContents.navigationHistory.restore({ index, entries })
}

下面是您可以使用 Electron Fiddle 打开的完整示例:

const { app, BrowserWindow, BrowserView, ipcMain } = require('electron')
const path = require('path')

function createWindow () {
const mainWindow = new BrowserWindow({
width: 1000,
height: 800,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false,
contextIsolation: true
}
})

mainWindow.loadFile('index.html')

const view = new BrowserView()
mainWindow.setBrowserView(view)
view.setBounds({ x: 0, y: 100, width: 1000, height: 800 })
view.setAutoResize({ width: true, height: true })

const navigationHistory = view.webContents.navigationHistory
ipcMain.handle('nav:back', () =>
navigationHistory.goBack()
)

ipcMain.handle('nav:forward', () => {
navigationHistory.goForward()
})

ipcMain.handle('nav:canGoBack', () => navigationHistory.canGoBack())
ipcMain.handle('nav:canGoForward', () => navigationHistory.canGoForward())
ipcMain.handle('nav:loadURL', (_, url) =>
view.webContents.loadURL(url)
)
ipcMain.handle('nav:getCurrentURL', () => view.webContents.getURL())
ipcMain.handle('nav:getHistory', () => {
return navigationHistory.getAllEntries()
})

view.webContents.on('did-navigate', () => {
mainWindow.webContents.send('nav:updated')
})

view.webContents.on('did-navigate-in-page', () => {
mainWindow.webContents.send('nav:updated')
})
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})

app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})