Zarządzanie zdarzeniami za pomocą skryptów działających w tle

Rozszerzenia to programy wykorzystujące zdarzenia do modyfikowania lub ulepszania sposobu przeglądania Chrome. Wydarzenia to reguły przeglądarki, takie jak przejście na nową stronę, usunięcie zakładki lub zamknięcie karty. Rozszerzenia monitorują te zdarzenia w skryptach działających w tle, a następnie reagują na podstawie określonych instrukcji.

Strona w tle jest ładowana, gdy jest potrzebna, i wyładowywana, gdy jest nieaktywna. Oto kilka przykładów zdarzenia obejmują:

  • Rozszerzenie jest najpierw instalowane lub aktualizowane do nowej wersji.
  • Strona w tle nasłuchiwała i zostało ono wysłane.
  • Skrypt treści lub inne rozszerzenie wysyła wiadomość.
  • inny widok rozszerzenia, np. wyskakujące okienko: wywołuje runtime.getBackgroundPage;

Po wczytaniu strona w tle pozostanie uruchomiona, dopóki będzie wykonywać określone działanie. na przykład przez wywołanie interfejsu API Chrome lub wysłanie żądania sieciowego. Dodatkowo strona w tle będzie nie wyładować z pamięci, dopóki nie zostaną zamknięte wszystkie widoczne widoki i porty wiadomości. Pamiętaj, że otwarcie widoku nie powoduje załadowania strony zdarzenia, a jedynie uniemożliwia jej zamknięcie po wczytaniu.

Skuteczne skrypty działające w tle pozostają uśpione do czasu, aż nasłuchują pożarów, zareaguj za pomocą określonych instrukcji, a następnie wyładuj.

Zarejestruj skrypty działające w tle

Skrypty działające w tle są zarejestrowane w manifeście pod polem "background". Są w tablicy po kluczu "scripts", a pole "persistent" powinno mieć wartość fałsz.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

Na potrzeby kodu modułowego można zarejestrować wiele skryptów działających w tle.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

Jeśli rozszerzenie używa obecnie stałej strony w tle, zapoznaj się z artykułem Migracja w tle Przewodnik, z którego dowiesz się, jak przejść na model nietrwały.

Inicjowanie rozszerzenia

Wysłuchaj zdarzenia runtime.onInstalled, aby zainicjować rozszerzenie podczas instalacji. Użyj tej do ustawienia stanu lub jednorazowego zainicjowania, np. za pomocą menu kontekstowego.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

Skonfiguruj detektory

Uporządkuj skrypty działające w tle według zdarzeń, od których zależy rozszerzenie. Definiowanie trafności pozwalają skryptom działającym w tle pozostaną uśpione do czasu ich uruchomienia. z brakujących ważnych reguł.

Detektory muszą być rejestrowane synchronicznie od początku strony.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

Nie rejestruj detektorów asynchronicznie, ponieważ nie zostaną one prawidłowo aktywowane.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

Rozszerzenia mogą usuwać detektory ze skryptów w tle przez wywołanie metody removeListener. Jeśli wszystkie detektory zdarzenia zostaną usunięte, Chrome nie będzie już ładować skryptu działającego w tle rozszerzenia na to wydarzenie.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

Filtruj zdarzenia

używać interfejsów API, które obsługują filtry zdarzeń, aby ograniczyć detektory do przypadków, które są ważne dla rozszerzenia; na temat witryny. Jeśli rozszerzenie nasłuchuje zdarzenia tabs.onUpdated, użyj parametru webNavigation.onCompleted z filtrami, ponieważ interfejs API tabulacji nie obsługuje filtry.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

Reagowanie na słuchaczy

Istnieją detektory, które aktywują funkcję po wywołaniu zdarzenia. Aby zareagować na zdarzenie, skonfiguruj strukturę pożądaną reakcję w zdarzeniu detektora.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

Wyładuj skrypty w tle

Dane należy przechowywać okresowo, aby nie utracić ważnych informacji w przypadku rozszerzenia. awarie bez uzyskania onSuspend. Aby to zrobić, możesz skorzystać z interfejsu API storage.

chrome.storage.local.set({variable: variableInformation});

Jeśli rozszerzenie korzysta z przekazywania wiadomości, upewnij się, że wszystkie porty są zamknięte. Skrypt działający w tle nie wyładować z pamięci, dopóki porty wiadomości nie zostaną zamknięte. Nasłuchiwanie zdarzenia runtime.Port.onDisconnect zapewni informacje o tym, kiedy są zamykane otwarte porty. Zamknij je ręcznie za pomocą runtime.Port.disconnect.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

Czas działania skryptu działającego w tle można obserwować, monitorując, kiedy wpis rozszerzenia pojawia się i znika z menedżera zadań Chrome.

ALT_TEXT_HERE

Otwórz menedżera zadań, klikając menu Chrome, najeżdżając kursorem na kolejne narzędzia i wybierając „Zadanie Menedżer”.

Skrypty działające w tle są wczytywane automatycznie po kilku sekundach bezczynności. W przypadku porządków na ostatnią chwilę jest wymagany, nasłuchuj zdarzenia runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

Trwałe dane należy jednak traktować jako priorytetowe, a nie polegać na runtime.onSuspend. Nie pozwala na jak najdokładniejsze oczyszczenie i nie pomaga w przypadku awarii.