/ / Rozszerzenie Chrome: Background.js „Uncaught TypeError” podczas próby uzyskania adresu URL karty - javascript, google-chrome, google-chrome-extension

Rozszerzenie Chrome: Background.js „Uncaught TypeError” podczas próby pobrania adresu URL karty - javascript, google-chrome, google-chrome-extension

Otrzymuję następujące ostrzeżenie / błąd z mojego rozszerzenia podczas otwierania narzędzia do debugowania (cały poniższy kod działa idealnie, ale generuje ten błąd):

Uncaught TypeError: Nie można odczytać właściwości „onUpdated” wartości undefined

W moim kodzie poniżej próbuję uzyskać adres URL bieżącej karty dla przeglądarki (to jest skrypt background.js)

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab) {
chrome.tabs.getSelected(null,function(tab) {
var tablink = tab.url;
console.log("Website: " + tablink);
});
});

Powyższy skrypt jest moim skryptem działającym w tle, wywołanym z manifestu.

"background": {
"scripts": ["background.js"]
},

Moje pytanie brzmi teraz, dlaczego generuje błąd, gdy kod działa? Błąd jest wyświetlany w chrome „debugging / inspect-element”. Jak mogę usunąć ten tak zwany „błąd” z debugowania?

EDYTOWAĆ Po użyciu wywołania „whoami” ze skryptu zawartości do skryptu działającego w tle pojawia się następujący błąd w skrypcie działającym w tle.

providing tab information background.js:3 Error in event handler for runtime.onMessage: Cannot read property "url" of undefined Stack trace: TypeError: Cannot read property "url" of undefined at chrome-extension://hejlnkjmnpomhknnbfjdfnablcmkloid/background.js:4:41 at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at EventImpl.dispatchToListener (extensions::event_bindings:397:22) at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at Event.publicClass.(anonymous function) [as dispatchToListener] (extensions::utils:89:26) at EventImpl.dispatch_ (extensions::event_bindings:379:35) at EventImpl.dispatch (extensions::event_bindings:403:17) at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at Event.publicClass.(anonymous function) [as dispatch] (extensions::utils:89:26) at messageListener (extensions::messaging:190:29) extensions::uncaught_exception_handler:9

Odpowiedzi:

1 dla odpowiedzi № 1

Nie wiem bezpośrednio, dlaczego Twój kod nie działa, ale:

Po pierwsze, getSelected jest obecnie przestarzałe, zapoznaj się z dokumentem https://developer.chrome.com/extensions/tabs#method-getSelected i użyj tabs.query {active: true};)

Po drugie, tutaj jest "rodzaj" niejednoznaczności "dla której zmienna" tab "jest używana kiedy piszesz" tab.url "czy jest to ta ze zdarzenia getSelected, czy ze zdarzenia Updated? (Jeśli jest ostatnia, getSelected jest bezużyteczne )


3 dla odpowiedzi № 2

Plik manifestu zawiera drobne błędy.Pliki skryptów używane w wyskakującym okienku lub na stronie opcji nie powinny być deklarowane jako skrypty zawartości. Wystarczy włączyć je do odpowiednich plików html (co już robisz), biorąc pod uwagę, że „nie planujesz umieszczać ich na innych zewnętrznych stronach internetowych.

Strony wyskakujące i opcje nie są skryptami zawartości. Mają przywilej używania interfejsów API Chrome tak samo, jak skryptów działających w tle.

Skrypty zawartości są umieszczane w innych witrynach internetowych.Jeśli naprawdę chcesz to zrobić, najprawdopodobniej powinieneś dołączyć również właściwość „run_at”. Z drugiej strony zależy to od tego, co chcesz z tym zrobić.

"content_scripts": [{
"matches": ["http://*/*","https://*/*"],
"js": ["jquery.js","chat.js","options.js"],
"run_at": "document_end"
}]

Jednak skrypty zawartości nie mają tego przywilejuaby uzyskać dostęp do interfejsu API zakładek. Używanie skryptów działających w tle jednocześnie jako skryptów zawartości prowadzi do tego typu błędów i może ostatecznie uszkodzić rozszerzenie, ale nadal może się wydawać, że rozszerzenie działa - przynajmniej w zakresie skryptów działających w tle (wyskakujące okienko, opcje).

Ściśle oddzielne skrypty tła i treści.Jeśli nie musisz wstrzykiwać kodu do innych witryn internetowych, sugerowałbym usunięcie go wraz z uprawnieniami - ostrzeżenie o pozwoleniu podczas instalowania rozszerzenia byłoby niepotrzebnie wymagające, gdybyś poprosił o pozwolenie na czytać i modyfikować dane użytkowników we wszystkich witrynach internetowych, tak czy siak.