5

Chciałbym uruchomić skrypt po załadowaniu karty pod podanym adresem URL. To prawie działa, ale faktycznie id nie :) To jest mój plik manifestu:Jak uruchomić ten skrypt po ponownym załadowaniu karty (rozszerzenie chrome)?

{ 
"manifest_version": 2, 

"name": "Sample Extension", 
"description": "Sample Chrome Extension", 
"version": "1.0", 

"content_scripts": 
[ 
    { 
     "matches": ["http://translate.google.hu/*"], 
     "js": ["run.js"] 
    } 
], 

"permissions": 
[ 
    "activeTab", 
    "tabs" 
], 

"browser_action": 
{ 
    "default_title": "Sample", 
    "default_icon": "icon.png" 
} 
} 

a to run.js:

chrome.tabs.onUpdated.addListener(
function (tabId, changeInfo, tab) 
{ 
    if (changeInfo.status === "complete") 
    { 
     chrome.tabs.executeScript(null, {file: "program.js"}); 
    } 
} 
); 

W programs.js tylko alerty jakiś tekst (jeszcze). Kiedy umieszczę alert w pierwszym wierszu pliku run.js, zostanie on ostrzeżony, ale kiedy umieści go w pliku if, to nie. Nie mogę znaleźć problemu. Czy coś napisałem źle?

+0

Czy sprawdziłeś błędy w konsoli programisty? Myślę, że musisz uruchomić to ze strony w tle, a nie ze skryptu treści. Uważam, że skrypty z zawartością mogą wykorzystywać tylko chrome.extension, a wszystkie inne metody w interfejsie API muszą być wywoływane na stronie background.js. – QFDev

+0

Hooking https://stackoverflow.com/q/23333771/632951 – Pacerier

Odpowiedz

8

Zakładając, że strony http://translate.google.hu/* są tymi, do których chcesz wprowadzić kod przy ponownym ładowaniu, musiałbyś to zrobić w nieco inny sposób. Obecnie jesteś zawsze wstrzykuje kod na te strony (bez pozwolenia, aby to zrobić, nie mniej), a następnie próbuje użyć api chrome.tabs w tym skrypcie treści, czego nie możesz zrobić. Zamiast tego umieścimy słuchacza na stronie w tle i wstrzykniemy kod tylko na odświeżenie strony, jak chcesz. Najpierw manifest:

{ 
    "manifest_version": 2, 
    "name": "Sample Extension", 
    "description": "Sample Chrome Extension", 
    "version": "1.0", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions":[ 
    "http://translate.google.hu/*", "tabs" 
    ] 
} 

background.js

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){ 
    if (tab.url.indexOf("http://translate.google.hu/") > -1 && 
     changeInfo.url === undefined){ 
    chrome.tabs.executeScript(tabId, {file: "program.js"}); 
    } 
}); 

To wykrywać zdarzenie onUpdated, sprawdza, czy jest to jeden z „s url które chcemy wprowadzić do, a następnie sprawdza, czy strona została przeładowana. Ten ostatni krok można uzyskać, sprawdzając, czy istnieje changeInfo.url. Jeśli tak, oznacza to, że adres URL został zmieniony, a zatem nie jest odświeżany. I odwrotnie, jeśli nie istnieje, to strona musi zostać odświeżona.

+0

Dzięki, że działa, ale jak uruchomić ten skrypt, jeśli na górze jest inna karta? –

+0

@Geiszla Co masz na myśli przez inną zakładkę na górze? – BeardFist

+1

Kiedy więc ponownie załaduję kartę, ale zmienię kartę. Następnie skrypt nie działa, ponieważ nie jest to strona (np. Translate.google.hu). –

1

content_scripts są uruchamiane przy każdym ładowaniu strony, więc najlepiej jest użyć tych do wykrycia.

W ten sposób nie ryzykujesz uruchomienia żadnego kodu w urządzeniu background, zanim Twój content_script będzie gotowy do odebrania dowolnej wiadomości.

+0

Wygląda na to, że istnieje błąd przeglądarki Chrome, w którym czasami manifestcript nie jest wyświetlany podczas ładowania strony. Zobacz https://stackoverflow.com/questions/19191679/chrome-extension-inject-js-before-page-load/19192010#comment78166411_19192010 – Pacerier

Powiązane problemy