Firefox扩展location.href没有重定向

时间:2016-11-08 10:09:27

标签: javascript firefox firefox-addon

我在这里使用了一些非常通用的东西,但实际上我希望能够在选择我的扩展名时在我想要的网址上加载新标签,然后在该标签页上重定向到新的网址。 (添加时应该在重定向之前在第一页运行一些代码,但那是另一天的代码。)

我目前的代码是

var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");

var button = buttons.ActionButton({
  id: "redirect",
  label: "redirect",
  icon: {
    "16": "./icon-16.png"
  },
  onClick: handleClick
});

function handleClick(state) {
    tabs.open({
    url: "http://www.google.com",
    onReady: loadRedirect
    });

  function loadRedirect(tab) {
    tab.attach({
      contentScript: "location.href = 'www.youtube.com;'"
    });
  }
} 

然而,当运行它时,第二个URL附加到第一个URL而不是替换,然后卡在无限加载/刷新循环中,直到我关闭浏览器。

我认为我错过了一些绝对明显的东西,但在搜索时我找不到任何东西。

1 个答案:

答案 0 :(得分:1)

您正尝试将location.href更改为没有方案的字符串。假设它是当前域中的URL。因为它也不以/开头,所以它被假定为相对于当前页面。因此,它会附加到当前google.com URL。页面准备就绪;触发ready事件;并且调用了您的onReady处理程序。然后,您的处理程序会更改URL,从而导致重新加载页面,并再次触发ready事件,从而重新启动该过程。这是你的无限循环。

要实际到达www.youtube.com,您可以将代码更改为:

function loadRedirect(tab) {
  tab.attach({
    contentScript: "location.href = 'https://www.youtube.com';"
  });
}

这可以在不需要通过分配到tab.url来注入内容脚本的情况下完成:

function loadRedirect(tab) {
  tab.url = 'https://www.youtube.com';
}

然而,这不会阻止无限循环。有很多方法可以做到这一点。最简单的方法是删除ready侦听器:

function loadRedirect(tab) {
  tab.off('ready',loadRedirect);
  tab.url = 'https://www.youtube.com';
}