以下链接时,content_script未在GitHub上运行

时间:2015-10-16 00:29:05

标签: google-chrome-extension content-script

我正在为Github Enterprise上的Pull Requests编写Chrome扩展程序并遇到了一个问题。当页面通过刷新加载或直接从浏览器输入URL时,当它从点击Github中的链接运行时它不会。

例如,如果您使用Pull Requests转到此页面并单击其中一个,则无法运行。但是如果你刷新那个相同的页面就会运行。

manifest.json

{
    "name": "Github Sample",
    "manifest_version": 2,
    "version": "0.0.1",
    "description": "Sample",
    "permissions": [
        "tabs", "<all_urls>",
        "http://github.com/*"
    ],
    "content_scripts": [
        {
            "matches": [ "https://github.com/*" ],
            "js": ["github.sample.js"],
            "run_at": "document_end"
        }
    ]
}

github.sample.json

// ==UserScript==
// @author Jacob Schoen
// ==/UserScript==

alert("Extension has Ran");

为了简化这一点,我已将其推送到github

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:2)

GitHub网站使用jquery-pjax库(请参阅How to make github style page transitions by pjax)。

  • 基本上,您只需要运行内容脚本一次,并在an injected <script> element code内附加pjax事件处理程序,这将重用网站的jQuery$变量。

    • 在这些处理程序中,您可以向您的内容脚本发送包含document.dispatchEvent的邮件,该邮件将在window.addEventListener("blabla", ...)
    • 中接收
    • 或者您可以在manifest.json中的github网站上allow the access to chrome.runtime.sendMessage,以便页面注入的代码能够发送可以由chrome.runtime.onMessageExternal侦听器中的扩展程序接收的消息。 / LI>
  • 或者您可以在后台脚本中使用chrome.webNavigation.onHistoryStateUpdated,但这会在安装过程中发出警告,该扩展程序可以“读取您的浏览历史记录”,这是一个全局权限,与内容脚本解决方案不同。< / p>

答案 1 :(得分:2)

我提出的工作示例,以防其他人帮助。

的manifest.json

{
    "name": "Github Sample",
    "manifest_version": 2,
    "version": "0.0.1",
    "description": "Sample",
    "permissions": [
        "activeTab",
        "tabs", "<all_urls>",
        "http://github.com/*"
    ],
    "content_scripts": [
        {
            "matches": [ "https://github.com/*" ],
            "js": ["github.sample.js"],
            "run_at": "document_idle"
        }
    ],
    "web_accessible_resources": ["inject.js"]
}

github.sample.js

// ==UserScript==
// @author Jacob Schoen
// ==/UserScript==

function myAlert() {
    alert("Extension has Ran");
}

window.addEventListener("pageLoadTransition", myAlert);

var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('inject.js');
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

//still have to load this one for direct page loads
myAlert();

inject.js

$(document).on('pjax:success', function() {
  var evt=document.createEvent("CustomEvent");
    evt.initCustomEvent("pageLoadTransition", true, true, null);
    document.dispatchEvent(evt);
})

我还使用工作示例更新了Github存储库。