content_script 在 GitHub 上点击链接时不是 运行
content_script not running on GitHub when following links
我正在写一个 Chrome 扩展,主要用于 Github Enterprise 上的 Pull Requests,并且 运行 成为一个问题。当通过刷新或直接从浏览器输入 url 加载页面时,它 运行s,当它是 运行 来自点击 Github 中的 link ] 它不是。
例如,如果您使用 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。
关于如何解决这个问题有什么想法吗?
GitHub 站点使用 jquery-pjax library (see How to make github style page transitions by pjax).
基本上你只需要 运行 内容脚本一次并在 an injected <script>
element code 中附加 pjax 事件处理程序,这将重用 jQuery
或 $
站点的变量。
- 在这些处理程序中,您可以将带有
document.dispatchEvent
的消息发送到您的内容脚本,内容脚本将在其 window.addEventListener("blabla", ...)
中接收它
- 或者您可以 allow the access to
chrome.runtime.sendMessage
在 manifest.json
的 github 站点上,这样页面注入代码将能够发送一条消息,该消息可以被 [=] 中的扩展程序接收17=]听众。
或者,您可以在后台脚本中使用 chrome.webNavigation.onHistoryStateUpdated,但这会在安装过程中引起警告,扩展可以 "Read your browsing history",这是一个全局权限,与内容脚本不同解决方案。
我想出的工作示例,以防对其他人有所帮助。
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 存储库。
我正在写一个 Chrome 扩展,主要用于 Github Enterprise 上的 Pull Requests,并且 运行 成为一个问题。当通过刷新或直接从浏览器输入 url 加载页面时,它 运行s,当它是 运行 来自点击 Github 中的 link ] 它不是。
例如,如果您使用 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。
关于如何解决这个问题有什么想法吗?
GitHub 站点使用 jquery-pjax library (see How to make github style page transitions by pjax).
基本上你只需要 运行 内容脚本一次并在 an injected
<script>
element code 中附加 pjax 事件处理程序,这将重用jQuery
或$
站点的变量。- 在这些处理程序中,您可以将带有
document.dispatchEvent
的消息发送到您的内容脚本,内容脚本将在其window.addEventListener("blabla", ...)
中接收它
- 或者您可以 allow the access to
chrome.runtime.sendMessage
在manifest.json
的 github 站点上,这样页面注入代码将能够发送一条消息,该消息可以被 [=] 中的扩展程序接收17=]听众。
- 在这些处理程序中,您可以将带有
或者,您可以在后台脚本中使用 chrome.webNavigation.onHistoryStateUpdated,但这会在安装过程中引起警告,扩展可以 "Read your browsing history",这是一个全局权限,与内容脚本不同解决方案。
我想出的工作示例,以防对其他人有所帮助。
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 存储库。