/ / chrome.tabs zwraca undefined w skrypcie zawartości - google-chrome, google-chrome-extension

chrome.tabs zwraca undefined w skrypcie zawartości - google-chrome, google-chrome-extension

chrome.tabs zwraca undefined, mimo że ustawiłem zakładki w bloku uprawnień.

"permissions": [
"tabs",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/myScript.js"
],
"all_frames": true
}
],

Ale w myScript.js następujące zwraca wartość undefined.

chrome.tabs

Odpowiedzi:

46 dla odpowiedzi № 1

Ponieważ skrypt treści ma swoje ograniczenia,

chrome.tabs jest dostępne tylko w skryptach w tle i skryptach wyskakujących.

Jeśli chcesz skorzystać chrome.tabs następnie przekaż wiadomość z content_script do skryptu w tle i graj chrome.tabs.


5 dla odpowiedzi nr 2

Skrypty treści mają ograniczony dostęp do interfejsów API Chrome. Ten dostęp nie obejmuje API, którego próbujesz użyć (np. chrome.tabs). Jeśli musisz użyć tego interfejsu API, będziesz musiał to zrobić w pliku skrypt w tle1.

Zgodnie z listą w Chrome dokumentacja skryptów zawartości, API dostępne dla skryptu zawartości to [Umieściłem przestarzałe metody w przekreślenie format]:

Kilka z wymienionych interfejsów API jest przestarzałych i są od jakiegoś czasu. Te, które są przestarzałe, zostały przeniesione do innych lokalizacji (również wymienionych powyżej):

Chociaż oficjalnie nie jest to przestarzałe, extension.lastError jest również dostępny jako runtime.lastError. W tym miejscu zwykle odnosi się do tego miejsca:

Podziel rozszerzenie na skrypty działające w tle i skrypty zawartości

Będziesz musiał podzielić swój kod naco powinno znajdować się w skrypcie działającym w tle, a co w skryptach zawartości, w oparciu o możliwości dostępne dla każdego typu skryptu. Skrypty zawartości mają dostęp do DOM strony internetowej, do której są wstawiane, ale mają ograniczony dostęp do rozszerzeń API. Skrypty działające w tle mają pełny dostęp do interfejsów API rozszerzeń, ale nie mają dostępu do zawartości strony internetowej. Powinieneś przeczytać Omówienie rozszerzenia Chromei stron, do których prowadzą linki z tego miejsca, aby zorientować się, jakie funkcje powinny znajdować się w danym typie skryptu.

Komunikacja między skryptami zawartości a skryptami działającymi w tle często wymaga komunikacji. Aby to zrobić, możesz użyć przekazywanie wiadomości. Pozwala to na przekazywanie informacjimiędzy dwoma skryptami, aby osiągnąć rzeczy, które nie są możliwe przy użyciu tylko jednego typu skryptu. Na przykład w swoim skrypcie zawartości możesz potrzebować informacji, które są dostępne tylko z jednego z pozostałych interfejsów API Chrome, lub potrzebujesz czegoś, co można najlepiej (lub tylko) zrobić za pomocą jednego z innych interfejsów API rozszerzeń Chrome. W takich przypadkach będziesz musiał wysłać wiadomość do skryptu działającego w tle, używając chrome.runtime.sendMessage(), aby powiedzieć mu, co należy zrobićdostarczenie wystarczających informacji, aby było to możliwe. Twój skrypt działający w tle może następnie zwrócić żądane informacje, jeśli takie istnieją, do skryptu zawartości. Alternatywnie, będziesz mieć chwile, kiedy przetwarzanie będzie odbywać się głównie w skrypcie w tle. Skrypt działający w tle może wstrzyknąć skrypt zawartości lub po prostu wysłać wiadomość do już wstrzykniętego skryptu, aby uzyskać informacje ze strony lub wprowadzić zmiany na stronie internetowej.


  1. Skrypt w tle oznacza dowolny skrypt znajdujący się w kontekście tła. Oprócz rzeczywistych plików background skrypty, obejmuje to wyskakujące okienka i strony opcji itp. Jednak jedyną stroną, na której możesz mieć pewność, że zawsze będzie dostępna do otrzymywania wiadomości ze skryptu zawartości, jest Twoja rzeczywista background skrypty określone w manifest.json. Inne strony mogą być czasami dostępne w wyniku interakcji użytkownika z przeglądarką, ale nie są one stale dostępne.

Ta odpowiedź została przeniesiona z duplikat pytania, a następnie zmodyfikowany.


1 dla odpowiedzi nr 3

https://developer.chrome.com/extensions/tabs#method-getSelected przedstawia

chrome.tabs.getSelected (integer windowId, function oddzwonić)
Przestarzałe od Chrome 33. Użyj tabs.query {active: true}.
Pobiera wybraną kartę w określonym oknie.

Może powinieneś użyć chrome.tabs.query w popup.js lubię to

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
console.log(tabs[0].url);
});

, przeładować swoje rozszerzenie i sprawdź wynik w elemencie inspect swojego rozszerzenia.

obraz wynikowy

obraz kodu

https://developer.chrome.com/extensions/tabs#type-Tab pokazuje, że Adres URL wyświetlana na karcie. Ta właściwość jest obecna tylko wtedy, gdy manifest rozszerzenia zawiera uprawnienie „karty”.(Tylko dla przypomnienia, że ​​ktoś zapomniał. Zapomniałem o tym, kiedy to testowałem).


-3 dla odpowiedzi № 4

Sprawdź również tę odpowiedź https://stackoverflow.com/a/6718277/449345 Ten pracował dla mnie

chrome.tabs.getSelected(null, function(tab){
console.log(tab);
});