如何运行窗口.历史记录(javascript),如果用户点击后退按钮

How to run window.history (javascript) if user clicks back button?

本文关键字:如果 用户 按钮 记录 何运行 运行 窗口 历史 javascript      更新时间:2023-09-26

我想运行以下命令:

window.history.go(-2);

在页面上的脚本正在运行,当用户点击后退按钮在Chrome扩展。我该怎么做呢?


(注意:有一个页面链接,但这是一个不同的情况,然后那个问题)

后退按钮触发一个浏览器级别的事件,这意味着它不能在content script级别被监听。然而,你可以在背景脚本中听它,但只能以有限的方式。您知道前进或后退按钮被按下的唯一时刻是在chrome.webNavigation.onCommitted事件期间。在这一点上,在导航过程中,新的页面已经至少部分加载,新的document已经交换了进来。这意味着我们使用后退按钮所做的任何更改都只会在上一页加载后发生,而不是最无缝的体验。

确定返回按钮是否被按下,然后返回两次的示例如下:

内容脚本

chrome.runtime.sendMessage({method:'setReferrer',referrer:document.referrer});

background.js

var referrer;
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  if(message.method == 'setReferrer')
    referrer = message.referrer;
});
chrome.webNavigation.onCommitted.addListener(function(details) {
  if(details.url == referrer && details.transitionQualifiers[0]=='forward_back')
    chrome.tabs.executeScript(details.tabId,{code:'window.history.go(-1);'}); 
});

使用referer获取前一个url的知识,并将其与当前加载页面的url进行比较。唯一不正确的情况是,如果您使用转发按钮转到与前一页相同的页面,我认为这种情况极不可能发生。这样做的限制是,在再次返回之前需要加载或至少部分加载前一个页面。您可能会比较chrome.webNavigation.onBeforeNavigate事件中的url,但这会导致一堆误报,并使再次直接导航到该特定页面变得非常困难。

一个更优雅的解决方案是按照Rob的建议,在中间页面使用location.replace,这样就不会有特定页面的历史记录,并且点击一次就可以达到您想要的效果。