【问题标题】:Run content script every time a page loads with Google Extensions?每次使用 Google 扩展程序加载页面时运行内容脚本?
【发布时间】:2011-11-28 06:00:54
【问题描述】:

我正在制作一个 Google Chrome 扩展程序。我的扩展目前扩展了内容区域和标题,以便为珠宝容器中的另一个图标(通知和好友请求所在的位置)腾出空间并添加图标。第一次加载页面时它可以正常工作,但是当您转到站点上的其他页面然后返回主页时,布局就会搞砸。

由于这不是代码问题(因为它在第一次加载页面时运行良好),我想知道是否有一种方法可以在每次加载页面时运行内容脚本。这可能吗,或者我可以在每次使用不同方法加载 Facebook 时将我拥有的 Javascript 注入到 Facebook 中吗?

【问题讨论】:

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


    【解决方案1】:

    据我了解,每次页面加载时您的代码都会正确注入,但是当用户选择不同的选项卡然后返回时,您需要再次运行代码吗?

    看看Page Visibility API。您应该能够监听visibilitychange 事件并再次运行您的代码。

    【讨论】:

    • 不完全——切换选项卡会保留第一次注入代码时的结果。我需要的是在 Facebook 上的任何页面单击 Facebook 按钮或单击主页时再次运行它。出于某种原因,我的脚本的一部分“撤消”了自己,而其他部分保留了第一次注入的结果。
    • 哦,所以你说的是当 Facebook 使用 AJAX 加载页面时,它们会破坏/删除你的一些更改?使用onpopstateonhashchange 并检查您的更改是否已恢复。根据需要添加回来。
    • onpopstateonhashchange 均无效。事实上,onhashchange 开始搞砸个人资料。
    • 您可能只需要每秒检查一下location.pathname 是否已更改以及是否检查您的修改。
    【解决方案2】:

    我找到了解决此问题的方法,即使用 setInterval() 每毫秒运行一次代码(或至少是并非总是运行的代码)。

    显然,除非我误解,Chrome 会在每个浏览器会话中运行一次代码,因此使用 setInterval() 是最好的选择。不过,奇怪的行为是 Chrome 运行了我的部分代码一次,然后除非满足某些情况,否则之后就不再运行了。

    setInterval() 在这种情况下创造了奇迹。

    【讨论】:

      【解决方案3】:

      您应该将脚本作为内容脚本添加到清单文件中。每个浏览器会话只执行一次后台页面。

      清单:

      {
        "name": "",
        "version": "",
        "description": "",
        "icons": { "16": "icon16.png",
                 "48": "icon48.png",
                 "128": "icon128.png"},
        "content_scripts": [
          {
            "matches": ["<all_urls>"],
            "js": ["go.js"],
            "all_frames":true
          }
        ],
        "permissions": [
          "*://*/*"
        ]
      }
      

      内容脚本文件(go.js):

      // your stuff
      

      PS:此方法不适用于 Chrome 内部页面...

      【讨论】:

      • 我以前用它作为内容脚本,但那更糟。我将其更改为从后台页面运行,这使问题变得更好(通常它实际上正在运行)。
      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多