因为我们的侧边栏Web扩展程序修改了Web浏览器中显示的HTML内容,所以我们希望在关闭侧边栏后将页面清除。
因此,我尝试了这一点:
(...)
class Sidebar extends React.Component {
(...)
componentDidMount() {
(...)
// on closing the sidebar
window.addEventListener('pagehide', () => {
console.log('Calling erase on tab', this.state.tabId);
browser.tabs.sendMessage(this.state.tabId, {aim: 'erase'});
console.log('AFTER');
});
}
(...)
}
const panel = document.getElementById('panel');
ReactDOM.render(<Sidebar />, panel);
(...)
const messageHandler = async (message) => {
console.log('CALL:', message);
switch (message.aim) {
case 'erase':
erase();
return true;
(...)
}
}
};
browser.runtime.onMessage.addListener(messageHandler);
关闭侧栏时,在浏览器控制台中的结果为:
Calling erase on tab 1
AFTER
并且什么都不会显示在Web控制台中,尽管 other 消息在关闭前以CALL <message>
格式显示。
我怀疑sidebar.js
可能在将消息发送到content.js
之前退出了。因此,我向事件监听器添加了await
和async
:
window.addEventListener('pagehide', async () => {
console.log('Calling erase on tab', this.state.tabId);
await browser.tabs.sendMessage(this.state.tabId, {aim: 'erase'});
console.log('AFTER');
});
然后在关闭侧栏时,浏览器控制台中的结果为(不包含AFTER
):
Calling erase on tab 1
尽管在关闭前 other 消息以CALL <message>
格式显示,但Web控制台中仍然没有显示什么。