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:
- Użyj
chrome.tabs.onUpdated.addListener()
, aby sprawdzić, kiedy strona jest changed - 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?
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 poprzezchrome.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 zchrome
API , pełny dostęp do DOM strony (nie do żadnego z obiektówwindow
, w tym ramek).
Skrypty zawartości są uruchamiane w zakresie między rozszerzeniem a stroną. Globalny obiektwindow
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();"});
}
});
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