我刚开始写Chrome扩展程序。 第一个项目:对于某些网站,如果您单击扩展名,则该扩展名会将Chrome重定向到当前的domainName / archive。
我正在使用chrome.tabs.update();
进行重定向。
如果我尝试重定向到诸如Yahoo.com
之类的硬编码URL,它将正常工作。
但是,如果我尝试重定向,使我真正想要的东西,例如developer.google.com/archive
(我知道不存在),Chrome尝试获取的结果URL是:
chrome-extension://injepfpghgbmjnecbgiokedggknlmige/developer.chrome.com/archive
Chrome是否出于某种原因将扩展程序ID附加在URL上?
在我的background.js中,我有以下内容:
chrome.runtime.onMessage.addListener(function(request, sender) {
chrome.tabs.update( {url: request.redirect});
我从this article获得了上面的代码。
其他人遇到了相同的问题here(但未回答)
完整的options.js是:
function createButton () {
chrome.tabs.getSelected(null, function(tab) {
var url = new URL(tab.url);
var domain = url.hostname;
archiveURL = domain + "/archive";
let page = document.getElementById('buttonDiv');
let button = document.createElement('button');
button.addEventListener('click', function() {
chrome.runtime.sendMessage({redirect: archiveURL}); // works if I send "Yahoo.com"
});
button.textContent = "> " + archiveURL; // So I know I am sending the right URL
page.appendChild(button);
})
}
createButton();
摘要: 如果我设置了
archiveURL = "http://sundxwn.tumblr.com/archive";
系统正确进入http://sundxwn.tumblr.com/archive
。
但是... (如果我设置了
archiveURL = domain + "/archive";
,并确认按钮文本显示为:http://sundxwn.tumblr.com/archive
,
Chrome尝试转到:chrome-extension://injepfpghgbmjnecbgiokedggknlmige/sundxwn.tumblr.com/archive
任何帮助将不胜感激。
答案 0 :(得分:0)
url.hostname
就是主机名。对于原始网址https://example.com/some/path
,它将为example.com
。
然后,您构造的URL为example.com/archive
。它不是以协议(例如http://
)或斜杠开头的,因此它被解释为当前页面URL的 relative URL。
您正在某个扩展页面(例如, page.html
或自动生成的背景页面。其URL例如:
chrome-extension://injepfpghgbmjnecbgiokedggknlmige/page.html
因此,要从相对URL构造绝对URL,Chrome会砍掉最后一个斜杠的路径并添加相对部分。
您需要来指定协议,以便Chrome理解它是与当前文档无关的URL。然后url.origin
就是https://example.com
,然后对其进行正确解释。