Как правильно слушать порт в расширении хрома?

Ссылка скопирована
1 ответ

Задача не дать вкладке умереть, а если коннект с фоновой страницей пропал, то перезагрузить
background.js

chrome.extension.onConnect.addListener(function(port) {         console.log("Connected .....");         port.onMessage.addListener(function(msg) {              try{                 port.postMessage('active_port');              } catch {                 port.postMessage('disable_port');              }         });    })

chrome.extension.onConnect.addListener(function(port) { console.log("Connected ....."); port.onMessage.addListener(function(msg) { try{ port.postMessage('active_port'); } catch { port.postMessage('disable_port'); } }); })

script.js

setInterval(() => {     try {         var port = chrome.extension.connect({             name: "Sample Communication"         });         port.postMessage("active back");         port.onMessage.addListener(function(msg) {             console.log(msg);         });     } catch {         localStorage.setItem('reload_' + appId, 1);         location.reload();     }  }, 5000);

setInterval(() => { try { var port = chrome.extension.connect({ name: "Sample Communication" }); port.postMessage("active back"); port.onMessage.addListener(function(msg) { console.log(msg); }); } catch { localStorage.setItem('reload_' + appId, 1); location.reload(); } }, 5000);

Дополнительно:

Каждую секунду отправляйте из контент-скрипта сообщение в фоновый процесс:
chrome.extension.sendMessage('Ваше сообщение');

В фоновом процессе слушайте приходящие сообщения:

chrome.extension.onMessage.addListener(function(message) { 	console.log('Принято сообщение: ' + message); });

chrome.extension.onMessage.addListener(function(message) { console.log('Принято сообщение: ' + message); });

Если связь с определенной вкладкой потеряна, пересоздаете его или обновляйте.

P. S. Существуют и иные способы предотвратить заморозку вкладки, если интересно, расскажу.

  • Вкладок куча и все слушают background . Хорошо, а если расширение отключили, удалили или у вкладки истек срок жизни?
  • Martovitskiy, вы можете использовать альтернативный способ сохранения жизни вкладки - на странице которую требуется сохранить активным просто добавьте mp3 трек в бесконечном цикле воспроизведения. Вкладки имеющее активное мультимедиа содержимое не морозятся. Думаю вполне очевидно, что вместо музыки можно воспроизводить просто тишину.

    Способ не поможет, если у вас заканчивается оперативная память. На этот случай нужно в фоновом процессе расширения запретить выгрузку вкладок в целях экономии памяти:

    chrome.tabs.onCreated.addListener(function(tab) {     chrome.tabs.update(tab.id, {         autoDiscardable: false     }); });  chrome.tabs.onReplaced.addListener(function(tabId) {     chrome.tabs.update(tabId, {         autoDiscardable: false     }); });  chrome.runtime.onInstalled.addListener(function(details) {     chrome.tabs.query({}, function(tabs) {         tabs.forEach(function(tab) {             chrome.tabs.update(tab.id, {                 autoDiscardable: false             });         });     }); });

    chrome.tabs.onCreated.addListener(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); chrome.tabs.onReplaced.addListener(function(tabId) { chrome.tabs.update(tabId, { autoDiscardable: false }); }); chrome.runtime.onInstalled.addListener(function(details) { chrome.tabs.query({}, function(tabs) { tabs.forEach(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); }); });

    Или установите это расширение.

  • Надим Закиров,

    Думаю вполне очевидно, что вместо музыки можно воспроизводить просто тишину.

    И мы будем видеть на вкладке значок динамика? ))

  • Алексей Ярков, это работает, что для меня главное. Если вы сможете предложить другой вариант было бы классно.
  • Надим Закиров, какой способ эффективнее? Расширение, аудио или autoDiscardable: false в background.script?
  • Martovitskiy, имеет смысл применить все три. Например, я своих ботах использую бесконечный трек и autoDiscardable: false - ничего не глохнет, все работает неделями без выключения.

    P. S. Есть еще один способ:

    chrome.tabs.update(tabID, { 'active': true }, function() {});

    chrome.tabs.update(tabID, { 'active': true }, function() {});

    Делает указанную вкладку активной, заморозка при этом должна спадать. Не проверял, но должно работать.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Для правильного прослушивания порта в расширении Chrome, вам необходимо создать фоновую страницу, которая будет отслеживать события и обрабатывать запросы. Вот пример кода на языке JavaScript, который позволит вам слушать порт в расширении Chrome:

```javascript
// Сначала создайте фоновую страницу, добавив следующую запись в файле манифеста вашего расширения (manifest.json):
"background": {
"scripts": ["background.js"],
"persistent": false
}

// Теперь создайте файл background.js и добавьте следующий код:
chrome.runtime.onConnect.addListener(function(port) {
console.assert(port.name == "myPort");
port.onMessage.addListener(function(msg) {
console.log("Received message: " + msg);
});
});

// Теперь вы можете установить соединение с портом из вашего контента, добавив следующий код в вашем файле контента (content.js):
var port = chrome.runtime.connect({name: "myPort"});
port.postMessage({message: "Hello, background!"});

```

Этот код создаст фоновую страницу, которая будет слушать порт с именем "myPort". После этого вы можете установить соединение с этим портом из вашего контента и отправлять сообщения на фоновую страницу.

Не забудьте также добавить необходимые разрешения в файл манифеста вашего расширения для работы с портами. Например, если вы хотите использовать порты для обмена сообщениями между фоновым скриптом и вкладками, добавьте следующую запись в файл манифеста:

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

Таким образом, вы сможете правильно слушать порт в расширении Chrome и обмениваться сообщениями между фоновой страницей и контентом. Надеюсь, это поможет вам решить вашу проблему!

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно