我有一个Chrome扩展程序,可以在静态位置创建弹出窗口。但是,如果用户移动弹出窗口然后将其关闭。我想将下一个弹出窗口设置为在上一个弹出窗口关闭的位置打开。
我的背景页面已经在侦听onRemoved和onFocusedChanged,但是这些仅返回窗口ID。
在用户移动弹出窗口之后,关闭窗口之前或关闭窗口之前,是否可以获取弹出窗口的最后top
和left
位置?
答案 0 :(得分:1)
我们可以使用beforeunload
事件,并且需要一种同步的数据保存方法,以确保在破坏页面的执行上下文之前成功完成数据。
如果弹出窗口运行您的扩展页面。
Popup的页面脚本可以将大小保存在所有扩展页面之间共享的同步localStorage中,包括后台脚本,您可以在下一次使用保存的值来创建弹出窗口。
window.addEventListener('beforeunload', () => {
localStorage.windowSize = JSON.stringify({
left: window.screenX,
top: window.screenY,
width: window.outerWidth,
height: window.outerHeight,
});
});
如果弹出窗口运行一个Web URL。
我们将不得不使用content script,在这里我们可以滥用chrome.runtime.connect将端口名称中的数据同步传递到后台脚本,该后台脚本将解析数据并将其保存在chrome.storage.local中。当然,您也可以在第一种情况下使用这种方法。
内容脚本:
window.addEventListener('beforeunload', () => {
chrome.runtime.connect({
name: 'windowSize:' + JSON.stringify({
left: window.screenX,
top: window.screenY,
width: window.outerWidth,
height: window.outerHeight,
})
});
});
确保内容脚本在弹出窗口内运行,例如,在创建弹出窗口后立即通过后台脚本中的chrome.tabs.executeScript运行。
后台脚本:
chrome.runtime.onConnect.addListener(port => {
if (port.name.startsWith('windowSize:')) {
const windowSize = JSON.parse(port.name.slice('windowSize:'.length));
chrome.storage.local.set({windowSize});
}
});