2016-09-27 2 views
0

Для моего расширения chrome я хочу выполнить действие, когда всплывающее окно browserAction закрывается. Я понимаю, что там нет встроенных событий, когда это происходит. Я нашел this suggestion, чтобы открыть соединение с фоновым скриптом, а затем использовать событие подключения port.onDisconnect, чтобы обнаружить, что всплывающее окно закрывается.Расширение Chrome: обнаружение, когда всплывающее окно закрывается

Однако, когда всплывающее окно закрывается, я вижу следующее сообщение об ошибке в консоли разработчика для фонового сценария:

(BLESSED_EXTENSION context for glkehflnlfekdijfhacccflbffbjhgbd) extensions::messaging:102: Uncaught TypeError: Cannot read property 'destroy_' of undefined{TypeError: Cannot read property 'destroy_' of undefined 
    at PortImpl.destroy_ (extensions::messaging:102:37) 
    at dispatchOnDisconnect (extensions::messaging:322:29)} 

скрипты, которые я использую подробно описаны ниже.

Вы видите, куда я иду не так?


manifest.json

{ "manifest_version": 2 

, "name": "Detect when popup closes" 
, "version": "0.1" 

, "browser_action": { 
    "default_icon": "popup.png" 
    , "default_popup": "popup.html" 
    } 

, "background": { 
    "scripts": [ 
     "background.js" 
    ] 
    } 
} 

popup.html

<!DOCTYPE html> 
<body> 
    <h1>Test</h1> 

    <script src="popup.js"></script> 
</body> 
</html> 

popup.js

var port = chrome.runtime.connect() 

background.js

chrome.runtime.onConnect.addListener(function (externalPort) { 
    externalPort.onDisconnect = function() { 
    try { 
     var ignoreError = chrome.runtime.lastError 
    } catch (error) { 
     console.log("onDisconnect") 
    } 
    } 
) 
+1

Предложения было обнаружение события в фоновом скрипте. Порт отключен *, потому что * всплывающее окно было уничтожено, поэтому прослушиватели событий не должны вызываться при отключении портов. – wOxxOm

+0

@wOxxOm Я переписал расширение bare-bones, чтобы использовать 'port.onDisconnect' в фоновом скрипте, как вы предлагаете. Однако это просто смещает ошибку до момента, когда всплывающее окно закрывается. –

+0

Ошибка в этом случае документирована и может быть проигнорирована простым присваиванием 'var ignoreError = chrome.runtime.lastError'. Важно то, что прослушиватель разъединения действительно срабатывает. – wOxxOm

ответ

3

onDisconnect не свойство, а объект, который предоставляет addListener метод регистрации обратного вызова:

externalPort.onDisconnect.addListener(function() { 
    var ignoreError = chrome.runtime.lastError; 
    console.log("onDisconnect"); 
}); 
+0

Я бы также рекомендовал сохранять 'externalPort' в переменную во внешней области; Я думаю, что в противном случае он рискует сбором мусора. – Xan

+0

Да, но только для изменения поведения порта позже. Сам слушатель зарегистрирован в внутренних службах браузера, чтобы он оставался. – wOxxOm

+0

Как вы получаете '.onDisconnect' для запуска при закрытии всплывающего окна? Всякий раз, когда я его реализую, он запускается только при удалении фактического расширения. – Paralellos

1

Для справки, вот рабочая версия сценария background.js:

chrome.runtime.onConnect.addListener(function (externalPort) { 
    externalPort.onDisconnect.addListener(function() { 
    console.log("onDisconnect") 
    // Do stuff that should happen when popup window closes here 
    }) 

    console.log("onConnect") 
}) 
Смежные вопросы