Chrome extension code vs Content scripts vs Injected scripts

Staram się, aby moje rozszerzenie Chrome uruchamiało funkcję init() po załadowaniu nowej strony, ale mam problem z zrozumieniem, jak to zrobić. Z tego, co rozumiem, muszę wykonać następujące czynności w tle.html:

  1. Użyj chrome.tabs.onUpdated.addListener(), aby sprawdzić, kiedy strona jest changed
  2. Użyj chrome.tabs.executeScript do uruchomienia skryptu.

Oto kod, który mam:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    chrome.tabs.executeScript(null, {code:"init();"});
});

//script.js
function init() {
    alert("It works!");
}

Zastanawiam się również, czy funkcja init() będzie miała dostęp do innych moich funkcji znajdujących się w inne pliki JS?

Author: Rob W, 2012-03-29

1 answers

Kod JavaScript w rozszerzeniach Chrome można podzielić na następujące grupy:

  • Kod rozszerzenia-pełny dostęp do wszystkich dozwolonych chrome.* APIs.
    Obejmuje to Stronę tła oraz wszystkie strony, które mają do niej bezpośredni dostęp poprzez chrome.extension.getBackgroundPage(), takie jak wyskakujące okienka przeglądarki .

  • Skrypty zawartości (poprzez plik manifest lub chrome.tabs.executeScript) - częściowy dostęp do niektórych z chrome API , pełny dostęp do DOM strony (nie do żadnego z obiektów window, w tym ramek).
    Skrypty zawartości są uruchamiane w zakresie między rozszerzeniem a stroną. Globalny obiekt window skryptu zawartości różni się od globalnej przestrzeni nazw strony/rozszerzenia.

  • Skrypty wtryskiwane (za pomocą ta metoda w skrypcie zawartości) - pełny dostęp do wszystkich właściwości strony. Brak dostępu do żadnego z API chrome.*.
    Skrypty iniekcyjne zachowuj się tak, jakby były włączone przez samą stronę i nie są w żaden sposób połączone z rozszerzeniem. Zobacz ten post aby dowiedzieć się więcej informacji na temat różnych metod wstrzykiwania.

Aby wysłać wiadomość z wtryskiwanego skryptu do skryptu zawartości, należy zastosować zdarzenia. Zobacz ta odpowiedź dla przykładu. Uwaga: wiadomość transportowana w ramach rozszerzenia z jednego kontekstu do drugiego jest automatycznie (JSON) - serializowana i parsed .


W Twoim przypadku, kod na stronie tła (chrome.tabs.onUpdated) prawdopodobnie zostanie wywołane przed obliczeniem skryptu zawartości script.js. Więc dostaniesz ReferenceError, ponieważ init nie jest .

Również, gdy używasz chrome.tabs.onUpdated, upewnij się, że sprawdzasz, czy strona jest w pełni załadowana, ponieważ zdarzenie zostanie wywołane dwukrotnie: przed załadowaniem i po zakończeniu:

//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (changeInfo.status == 'complete') {
        // Execute some script when the page is fully (DOM) ready
        chrome.tabs.executeScript(null, {code:"init();"});
    }
});
 148
Author: Rob W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:14