вторник, 18 февраля 2014 г.

Фоновые страницы (Background Pages)

Судя по всему это отмирающий инструмент. В новой документации разработчика, они не входят в “Основы” и вообще отошли на второй план. Новая парадигма – использование страниц типа Event. Гугл рекомендует использовать именно их.

Что же это такое Background Pages:

imageРасширению часто требуется общий для всех вкладок скрипт, который обеспечивает их взаимодействие, хранит состояние.  В конце концов, объединяет в одном месте весь используемый код, вместо того чтобы загружать его для каждой вкладки индивидуально.

Фоновая страница – это невидимая страница, которая как раз и содержит такой скрипт. Их бывает два типа: persistent (постоянные) и event (управляемые событиями). Persistent, как можно догадаться, загружена постоянно, а event-страница загружается только при необходимости, когда возникает связанное с ней событие.

Когда в документации упоминается background page, то речь обычно идет о persistent background page. А Event background page называют просто event page. Ниже речь пойдет про постоянные страницы.

Примечание:

для режима “инкогнито” может быть создана своя копия фоновой страницы, в зависимости от некоторых настроек.

Для взаимодействие между отдельными страницами можно использовать прямые вызовы скриптов, как это делается при взаимодействии фреймов. Метод extension.getViews возвращает список всех открытых окон для каждой страницы где активно ваше расширение, а метод extension.getBackgroundPage позволяет обратиться к фоновой странице.

Манифест

В общем случае фоновая страница не содержит никакой HTML-разметки. Зачем? Она же невидимая. Поэтому в манифесте мы указываем только скрипты которые нужно на нее загрузить, а пустой документ браузер создает автоматически.

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

Но можно загрузить и HTML. Например разместить там какие-то шаблоны, ну или просто вам так привычнее.

{
"name": "My extension",
...
"background": {
"page": ["background.html"]
},
...
}

В некоторых случаях еще нужно указать "background" permission. Это приведет к тому что ваш браузер будет загружен постоянно, в фоновом режиме. Он загрузится сразу после включения компьютера и останется в памяти даже если вы закрыли все окна. Это необходимо, например, для вывода уведомлений.


Пример


Демонстрирует как фоновая страница обрабатывает события и может взаимодействовать с другими страницами в расширении. У этого расширения есть одна фоновая страница и неограниченное количество страниц созданных с помощью tabs.create из файла image.html.

В данном примере можно без проблем перейти от использования постоянной страницы к странице управляемой событиями, потому что собственно так event-страница и работает – регистрирует обработчик события, а никакой информации между отдельными вызовами не хранится, либо хранится в другом месте (в данном случае на вкладках созданных из image.html).

background.js

// Регистрируем обработчик нажатия на иконку расширения.
chrome.browserAction.onClicked.addListener(function(tab) {
var viewTabUrl = chrome.extension.getURL('image.html');
var imageUrl = /* тут мы как-то определяем URL загружаемой картинки */;

// Ищем – может мы уже открывали вкладку для загрузки картинок?
var views = chrome.extension.getViews();
for (var i = 0; i < views.length; i++) {
var view = views[i];

// Если так и есть, но картинка там сейчас отсутствует
if (view.location.href == viewTabUrl && !view.imageAlreadySet) {

// вызываем скрипт из этой вкладки и передаем ему адрес картинки.
view.setImageUrl(imageUrl);
view.imageAlreadySet = true;
break; // телемаркет
}
}
// Ничего не найдено, тут должно быть создание новой вкладки с помощью tab.create
});

image.html

<html>
<script>
function setImageUrl(url) {
document.getElementById('target').src = url;
}
</script>

<body>
<p>
Image here:
</p>

<img id="target" src="white.png" width="640" height="480">

</body>
</html>

2 комментария:

  1. я ничё не понял. Мне нужно просто, чтобы фон не загружался, при нажатии вкладки или ссылки на странице, чтобы фон был 1 и тот же всегда. Напиши пожалуйста как это сделать? chart41@bk.ru

    ОтветитьУдалить
  2. у меня звук идёт посторонний из гугла всякая реклама.Она запускается когда запускаешь гугл hmeleov260@gmail.com

    ОтветитьУдалить