0

我正在尝试编写与 xkcd 相关的 chrome 扩展,并且我希望能够判断当前页面是否来自random button。不幸的是,该 URL ( http://dynamic.xkcd.com/random/comic/ ) 未在网络历史记录中找到,并且不适用于document.referrer. 有没有办法获取上一页,即使它不在网络历史记录中?还是有更好的方法来做到这一点?

4

2 回答 2

2

我认为这是一个安全限制,您只能访问引荐来源网址,并且随机处理服务器端仅返回新页面,它是一个功能(可以这么说)而不是您访问过的页面。

我唯一的建议是检查引荐来源网址是否是同一个域(xkcd)但不是一个连续的 url

即当前网址是 xkcd.com/189 是推荐人 /188 或 /190 否则假设它是随机的

于 2013-04-06T19:55:46.330 回答
1

没有什么可以阻止您直接执行此操作。随机页面是一个307重定向,它由浏览器无形地处理,但您可以使其更加可见。我不确定你想用它来自随机按钮的知识做什么,但请考虑以下示例:

清单.json

{
  "name": "Chrome webrequest test",
  "version": "0.1",
  "description": "A test for webrequest",
  "manifest_version": 2,
  "permissions": [
    "<all_urls>","webRequest","webRequestBlocking"
  ],
  "background": {
    "scripts": ["bgp.js"],
    "persistent": true
  },
  "content_scripts": [{
    "matches": ["http://xkcd.com/*"],
    "js": ["xkcdInject.js"]
  }]
}

bgp.js

var requestIds = [];

chrome.webRequest.onBeforeRedirect.addListener(function(details){
  requestIds.push(details.requestId);
},
{urls: ["http://dynamic.xkcd.com/random/comic/"]});

chrome.webRequest.onCompleted.addListener(function(details){
  var n = requestIds.indexOf(details.requestId);
  if(n > -1){
    setTimeout(function(){
      chrome.tabs.sendMessage(details.tabId,{random:"true"});
    },1000); 
    requestIds.splice(n,1);
  }
},
{urls: ["http://xkcd.com/*"]},["responseHeaders"]);

xkcdIject.js

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
  if(message.random == 'true')
    console.log("This page came from the random button.");
});

在此示例中,它正在侦听随机按钮的使用,然后将有关此使用的知识发送到相关选项卡。有了这个,你的标签就知道它是否来自随机按钮。

于 2013-04-06T21:03:13.990 回答