2016-09-27 149 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正如你所建议的那样,我已经重写了我的裸骨扩展以在后台脚本中使用'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") 
}) 
相关问题