我想运行以下内容:
window.history.go(-2);
当用户单击Chrome扩展程序中的后退按钮时,在运行脚本的页面上。我怎么能这样做?
(注意:页面已链接,但这与问题不同。)
答案 0 :(得分:2)
后退按钮会触发浏览器级别事件,这意味着无法在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);'});
});
这使用引荐来获取前一个URL的知识,并将其与当前加载页面的url进行比较。唯一不合适的是,如果您使用前进按钮转到上一页的同一页面,我认为这种情况不太可能发生。这具有在再次返回之前需要加载或至少部分加载前一页的限制。您可能会比较来自chrome.webNavigation.onBeforeNavigate
事件的网址,但这会导致大量误报,并且很难再次直接导航到该特定网页。
一个更优雅的解决方案是做Rob suggests,而不是在中间页面上使用location.replace
,这样就不会有特定页面的历史记录而且回击一次会完全与你有关想。