获取关闭窗口的位置

时间:2018-08-15 04:40:47

标签: javascript google-chrome-extension

我有一个Chrome扩展程序,可以在静态位置创建弹出窗口。但是,如果用户移动弹出窗口然后将其关闭。我想将下一个弹出窗口设置为在上一个弹出窗口关闭的位置打开。

我的背景页面已经在侦听onRemoved和onFocusedChanged,但是这些仅返回窗口ID。

在用户移动弹出窗口之后,关闭窗口之前或关闭窗口之前,是否可以获取弹出窗口的最后topleft位置?

1 个答案:

答案 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});
      }
    });