【问题标题】:Check if a certain URL is opened and change a query string value检查是否打开某个 URL 并更改查询字符串值
【发布时间】:2012-09-24 09:35:06
【问题描述】:

大家好!我决定第一次尝试为 Chrome 制作扩展程序,我有这个想法,但我不知道如何开始。我希望你能指出我正确的方向。

我想检测是否打开了某个 URL,然后更改其查询字符串之一的值。例如:

  1. 我打开页面http://downloadpage.url/?page=info&id=123456
  2. 扩展程序将检测到这一点并将查询字符串“page”值从“info”更改为“download”,并继续使用新值打开页面。

我该怎么做?我认为所需的权限是 WebRequest 和 WebRequestBlocking 但我不确定。我在这里尝试了这些步骤:Detect if URL is opened - Chrome extension 但即使将 background_page 更改为 background 以说明我的清单版本(我的 Chrome 版本是 21.0.1180.89),它似乎也不起作用。我希望我可以在那里修改代码,但不幸的是它对我不起作用,现在我迷路了。

【问题讨论】:

  • WebRequest API 在这种情况下听起来是最好的选择。你能展示你尝试过的东西吗(因为你声称它没有按预期工作)。有关另一个示例,请参阅 Stack Overflow 上的 Chrome Redirect Extension
  • 到目前为止,我所尝试的只是上面一个 Stack Overflow 示例的链接,并对它进行了一些小的修改。我一直在寻找其他示例,但您提供的示例似乎提供了很多信息。我会先尝试一下,看看我能走多远。谢谢!
  • Rob,多亏了你,我才能做到我想要的。我回答了我自己的问题,但如果你有更好的解决方案,我会全力以赴!再次感谢。 :)

标签: google-chrome google-chrome-extension


【解决方案1】:

按照 Rob W 在上面评论中的链接(谢谢 Rob!),我想出了一些符合我想要的代码。首先,当我在预期的 URL 中时,我将以下内容添加到清单中以运行内容脚本:

  "content_scripts": [
     {
       "matches": [
          "http://downloadpage.url/*"
       ],
       "js": ["background.js"]
     }
  ]

显然网址是假的……

然后使用以下函数创建了一个名为 background.js 的文件,这使得获取查询字符串变得容易。原始代码来自here,我对其进行了一些修改以使其可重复用于其他链接或字符串。:

function getQueryString(URL) {
  if (!URL) {
    URL = location.search;
  }
  else
  {
    var a = document.createElement('a');
    a.href = URL;
    URL = a.search;
  }

  var result = {}, queryString = URL.substring(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}

最后,使用修改后的查询字符串进行重定向的代码如下:

if (page == "info")
{
  var ID = getQueryString()["id"];

  location.replace('http://downloadpage.url/?page=download&id='+ID;);
}

我仍然愿意接受更好、更优雅的解决方案,但这正是我想做的。如果您有更好的想法,请告诉我。干杯!

【讨论】:

  • 1.当它不是后台脚本时,不要调用您的脚本background.js。更合适的名称是contentscript.js 2。由于您只想处理URL,因此将"run_at": "document_start" 添加到清单文件的内容脚本部分。 3. webRequest API 是一个更好的工具,是什么阻止你使用这个 API 编写代码?
  • 我打算更改文件名。我只是使用了当时可用的js文件。
  • 哎呀!我不小心发布了不完整的回复!我真的很想使用 WebRequest 但是当我尝试你提供的链接上的代码时没有任何反应——即使没有改变它,这感觉很奇怪。我尝试的第一个代码也发生了同样的事情。另一方面,我正在考虑完全放弃这个想法,只是让我的扩展程序修改引用页面上的链接。我认为这将是更多的工作,但它不再需要进行重定向,这使得它在我看来更快。
  • 替换链接不如重定向可靠。您使用的是哪个 Chrome 版本? webRequest 仅在 Chrome 17 之后可用(仅供参考,我们目前在稳定频道的 Chrome 21 上)。这是一个应该工作的例子:pastebin.com/Nf8Nvf3Z
  • 我也是第 21 版。您提供的代码有效!惊人的!不过,我现在使用的是另一台计算机,所以可能是在我昨天使用的计算机上安装 Chrome 是问题所在。等我回家后我会尝试重新安装它,希望它也能在那里工作。另外,请发布您的答案,以便我可以标记它!非常感谢! :D
猜你喜欢
  • 2011-04-18
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
相关资源
最近更新 更多