-1

我想运行以下内容:

window.history.go(-2);

在脚本正在运行的页面上,当用户单击 Chrome 扩展程序中的后退按钮时。我怎样才能做到这一点?


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

4

1 回答 1

2

后退按钮会触发浏览器级别的事件,这意味着它无法在某个content script级别上被监听。但是,您可以在后台脚本中收听它,但只能以有限的方式。您意识到按下前进或后退按钮的唯一时间是在chrome.webNavigation.onCommitted活动期间。在导航过程中的这一点上,新页面已经至少部分加载并且新页面document已经被换入。这意味着我们使用返回按钮按下的知识所做的任何更改只会在前一页面加载后发生,不是最无缝的体验。

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

内容脚本

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

背景.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);'}); 
});

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

一个更优雅的解决方案是按照 Rob的建议进行操作,而不是location.replace在中间页面上使用,这样该特定页面就没有历史记录,并且回击一次将完全符合您的要求。

于 2013-05-03T23:23:34.630 回答