我正在为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。
有关如何解决此问题的任何想法?
答案 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存储库。