2016-09-27 143 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") 
})