Расширение Chrome: выполнять фоновую страницу только один раз при запуске Chrome

Я играю с расширениями Chrome, мой манифест загружает фоновую страницу с:

...
"background": { "scripts": ["background_page.js"], "persistent": false },
...

Код .js выглядит так:

var once = false;
window.addEventListener("load", function () {
  if ( once == true ) { return; }
  alert( 'test' );
  once = true;
}, false);

Кажется, это работает нормально, но я хочу запускать код background_page.js только один раз при каждом запуске браузера.

Прямо сейчас, я не уверен, почему, но код выполняется более одного раза. Сначала я думал, что он выполняется каждый раз, когда я открываю новую вкладку, но это не так. Предупреждение появляется, когда я запускаю браузер, затем, если я быстро открою новую вкладку, предупреждение не появится, но если я подожду около 1 минуты или около того и открою новую вкладку, предупреждение появится снова.

Как я могу убедиться, что код background_page.js выполняется только один раз при каждом запуске браузера?


person PeterF    schedule 13.07.2013    source источник


Ответы (3)


Вы используете страницу событий(background_page.js). Страницы событий выгружаются, когда браузер обнаруживает, что страница ничего не делает. Итак, что происходит, когда вы открываете новую вкладку, страница события перезагружается и снова начинает выполняться сверху. Таким образом, Chrome может заставить ваше приложение использовать меньше памяти и ускорить работу браузера.

Если вы хотите решить проблему, просто используйте persistent:true, что гарантирует, что страница «сохранится» на неопределенный срок или до тех пор, пока пользователь не закроет браузер. Если вы действительно хотите, чтобы ваше приложение эффективно использовало память, вам следует взглянуть на метод runtime.onSuspend, который вызывается каждый раз, когда ваша страница событий выгружается. Таким образом, вы можете сохранить материал до того, как страница будет выгружена, чтобы вы могли продолжить с того места, на котором остановились.

person 1337holiday    schedule 13.07.2013
comment
Очень полезно, можете указать источник, откуда вы берете эту информацию. Спасибо! - person Hemant Kumar; 10.04.2019

ОБНОВЛЕНИЕ: согласно текущей документации вам просто нужно удалить ключ persistent (не нужно менять его на "persistent": true).

Это страница мероприятия:

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["eventPage.js"],
    "persistent": false
  },
  ...
}

Это фоновая страница:

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js"]
  },
  ...
}
person quackkkk    schedule 18.03.2017
comment
Обновить ссылку? - person Pacerier; 14.05.2019
comment
@Pacerier смотрите мой ответ для большего контекста. - person lasec0203; 06.11.2019

Чтобы расширить ответ quackkkk, опускание ключа "persistent" в manifest.json равнозначно установке его на "persistent": true

Доказательство:

В документах говорится, что:

Единственная возможность сохранить фоновый скрипт постоянно активным — это если расширение использует API chrome.webRequest для блокировки или изменения сетевых запросов. API webRequest несовместим с непостоянными фоновыми страницами.

Имея это в виду, мы можем проверить manifest.json. один из примеров проектов расширения, без файлов cookie, в котором используется API webRequest. и убедитесь, что он явно не устанавливает "постоянный"

person lasec0203    schedule 06.11.2019