2015-10-16 51 views
0

我正在寫一個Chrome擴展,主要針對Github Enterprise上的Pull請求,並且遇到了問題。當頁面通過刷新加載或從瀏覽器直接輸入url時,它會運行,當它通過單擊Github中的鏈接運行時,它不會運行。content_script在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

GitHub站點使用jquery-pjax庫(請參閱How to make github style page transitions by pjax)。

  • 基本上你只需要運行一次的內容腳本和附加內an injected <script> element code將被重新使用該網站的jQuery$可變pjax事件處理程序。

    • 在這些處理器可以用document.dispatchEvent將消息發送到您的內容腳本,將獲得在其window.addEventListener("blabla", ...)
    • ,或者你在manifest.json GitHub的網站可以allow the access to chrome.runtime.sendMessage,使頁面注入代碼,就能夠發送一條可由chrome.runtime.onMessageExternal監聽器中的擴展接收的消息。
  • 或者你可以在後臺腳本中使用chrome.webNavigation.onHistoryStateUpdated但安裝該擴展可以「讀你的瀏覽歷史記錄」,這是不同的內容腳本解決方案的全球許可過程中會產生警告。

+0

謝謝,我認爲這讓我朝着正確的方向前進。 –

+0

再次感謝您,我能夠解釋您的解釋。 –

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的倉庫。

相關問題