2015-10-30 3 views
0

Как загрузить Chrome сценарий содержимого только в подкаталоге сайта. Например:Загрузка скрипта содержимого только в подкаталог сайта

В:https://www.example.com/#!/video/*
Не в:https://www.example.com/

Так что я не хочу, чтобы загрузить на домашней странице, а в каталоге видео. Я пробовал шаблон соответствия, но это не работает.

"matches": ["*://*.example.com/*", "*://*.example.com/#!/video/*"]

Мои URLs выглядеть следующим образом: www.example.com/#!/video/random_numbers/some-random-string

PS: Я также хочу, чтобы загрузить сценарий снова после каждых Ajax запросов со страницы.

ответ

1

Проблема заключается в том, что URL-фрагменты (URL хэши) не поддерживаются в "matches" и нет никакого способа, чтобы использовать "content_scripts" раздел autoinject/autoremove сценарии, основанные на изменении хэш, потому что страница не перезагружается на самом деле.

Удалите весь раздел "content_scripts" из manifest.json и используйте webNavigation API, чтобы ввести/активировать скрипт содержимого только при необходимости (требуется "permissions: ["webNavigation"]).

  • background.js:

    chrome.webNavigation.onCommitted.addListener(function(details) { 
        injectOrActivate("onCommitted", details); 
    }); 
    chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) { 
        injectOrActivate("onHashChange", details); 
    }); 
    
    function injectOrActivate(event, details) { 
        var tabId = details.tabId; 
    
        if (details.url.indexOf("#") < 0) { 
         deactivateContentScript(tabId); 
         return; 
        } 
    
        chrome.tabs.executeScript(tabId, {code: "injectedStatus"}, function(res) { 
         if (res[0] != "injected") { 
          chrome.tabs.executeScript(tabId, {file: "content.js"}, function(res) { 
           activateContentScript(tabId); 
          }); 
         } else { 
          activateContentScript(tabId); 
         } 
        } 
    } 
    
    function activateContentScript(tabId) { 
        chrome.tabs.sendMessage(tabId, {action: "activate"}); 
    } 
    
    function deactivateContentScript(tabId) { 
        chrome.tabs.sendMessage(tabId, {action: "deactivate"}); 
    } 
    
  • content.js:

    var injectedStatus = "injected"; 
    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
        switch (msg.action) { 
         case "activate": 
          doSomething(); 
          break; 
         case "deactivate": 
          stopDoingSomething(); 
          break; 
        } 
    }); 
    
+0

Удаление '' ' "*: //*.example.com/*"' '' тоже не помогает. – Zip

+0

О, извините, см. Обновленный ответ – wOxxOm

+0

Другой способ - это обычные скрипты контента и делать только на основе текущего URL-адреса, наблюдая за его изменением. также, часть об обработке последующих изменений страницы через ajax уже рассмотрена в s.o. –

Смежные вопросы