【问题标题】:How to modify current url location in chrome via extensions如何通过扩展修改 chrome 中的当前 url 位置
【发布时间】:2010-12-25 21:24:32
【问题描述】:

我想创建一个扩展程序,当用户点击扩展程序按钮时将其重定向到另一个网站。到目前为止,我只看到为每次点击创建一个新标签的扩展程序。

是否可以使用活动标签将用户重定向到另一个网站?

我尝试过这样的事情:

chrome.browserAction.onClicked.addListener(function(tab) {
    var url = "https://www.mipanga.com/Content/Submit?url="
        + encodeURIComponent(tab.url)
        + "&title=" + encodeURIComponent(tab.title);

    document.location.href = url; // <-- this does not work
});

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension


    【解决方案1】:

    注意:如果您开发跨浏览器扩展(希望您这样做!),我建议您使用chrome.tabs.query()。请参阅Jean-Marc Amon's answer 了解更多信息。这个答案在 Firefox 和 Chrome 中仍然有效,但 query() 更常用,有更多选项,并且适用于背景页面和弹出视图。

    通过chrome.tabs API,您可以使用getCurrent()query()update()

    目前,我更喜欢update(),因为它允许您更新当前选项卡,而无需执行其他操作。
    注意:您不能在内容脚本中使用update()

    如果需要从内容脚本更新 url,那么您应该改用 query。 Jean-Marc Amon 的answer 提供了一个很好的例子,说明如何在这种情况下获得活动标签(不要忘记给他投票!)。

    update()

    let myNewUrl = `https://www.mipanga.com/Content/Submit?url=${encodeURIComponent(tab.url)}&title=${encodeURIComponent(tab.title)}`;
    chrome.tabs.update(undefined, { url: myNewUrl });
    

    在这里,我们将 update 的第一个参数设置为 undefined。这是您要更新的选项卡 ID。如果未定义,Chrome 将更新当前窗口中的当前选项卡。

    有关update 的更多信息,请参阅Domino's answer,并注意不需要undefined。同样,如果您觉得有用,请不要忘记也为他们的回答点赞。

    getCurrent()

    getCurrent 也不能从非选项卡上下文(例如背景页面或弹出视图)中调用。

    获得当前标签后,只需传递update()

    chrome.tabs.getCurrent(function (tab) {
      //Your code below...
      let myNewUrl = `https://www.mipanga.com/Content/Submit?url=${encodeURIComponent(tab.url)}&title=${encodeURIComponent(tab.title)}`;
    
      //Update the url here.
      chrome.tabs.update(tab.id, { url: myNewUrl });
    });
    

    注意:要使用此功能,您必须确保在您的 manifest.json 文件中启用了tabs permission: p>

    "permissions": [
      "tabs"
    ],
    

    【讨论】:

    • 我们可以在我们的外部js文件中包含这段代码吗?还是必须在 chrome popup.html 上?谢谢!
    • @Toni - 是的,它可以从外部文件中调用。
    • @Dan 我建议您查看选项卡上的文档,因为它可能有所改变。也就是说,同样的代码适用于我最新的 Chrome 开发版本(21.0.1171.0 dev-m),没有问题。老实说,如果它没有像 Google 那样让开发人员保持最新状态,我会感到惊讶,而且我自己的扩展程序也使用相同的逻辑。如果扩展功能的这样一个主要部分在没有警告的情况下突然改变,就会有一些反弹。文档:code.google.com/chrome/extensions/tabs.html
    • 我遇到了与 chrome.tabs.getCurrent(function(tab){}) 相同的问题,我使用 chrome.tabs.getSelected(null, function(tab){}) 代替,它工作正常
    • 为了后代,我删除了在 v33 中已弃用的 getSelected。您应该只使用querygetCurrent
    【解决方案2】:

    如果没有传递标签ID,chrome.tabs.update 方法将自动在当前活动标签上运行。

    这具有不需要tabs 权限的额外优势。具有此权限的扩展程序会警告用户他们可以阅读浏览历史记录,因此如果不需要,您应该避免询问。

    更改当前选项卡的 URL 就像这样简单:

    chrome.tabs.update(undefined, {url: 'http://example.com'});
    

    或者如 cmets 中 farwayer 所提到的,您根本不需要放置两个参数。

    chrome.tabs.update({url: 'http://example.com'});
    

    【讨论】:

    • 有效。谢谢你!
    • 您可以使用该代码将文本字符串添加到当前 URL 吗? IE。将“&sandbox=true”添加到当前 URL?
    • @scott.schaffer 我认为您需要tabs 权限,因为您需要在添加标签之前检索标签的当前 URL。
    • 你甚至可以跳过第一个参数chrome.tabs.update({url: 'http://example.com'});
    • @CảnhToànNguyễn 听起来您可能正在将相对 URL 传递给 chrome.tabs.update。确保传入包含协议的完整 url。如果不是这样,那么您可能应该打开自己的 StackOverflow 问题。
    【解决方案3】:

    你也可以使用 chrome.tabs.query

    chrome.tabs.query({currentWindow: true, active: true}, function (tab) {
          chrome.tabs.update(tab.id, {url: your_new_url});
    });
    

    【讨论】:

    • 这应该是公认的答案。 'getSelected' 已被弃用
    • @Jean-Marc Amon tabparam 其实是数组类型,所以应该是tabs[0].id
    • 有没有办法取 chrome.tabs.update(tab.id );并在 URL 中添加一串文本? IE。喜欢将 '&sandbox=true' 添加到当前 URL 吗?
    • 尚未尝试,但我认为它会起作用,所以请尝试告诉我
    • 我试过这个方法,但是url结果出乎意料:chrome://extension// 如何删除不需要的前缀?
    猜你喜欢
    • 2011-11-15
    • 2011-12-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多