【问题标题】:window.close() minimizes Chrome with a froze white popup window instead of closing a popup windowwindow.close() 使用冻结的白色弹出窗口最小化 Chrome,而不是关闭弹出窗口
【发布时间】:2014-04-30 14:55:26
【问题描述】:

我编写了一个在 PC 上运行良好的 Chrome 扩展程序。在 Mac 上测试它时,我遇到了一些奇怪的行为。 在某些情况下,我会在保持窗口打开的同时强制关闭弹出窗口。 (同样,在 Windows 上工作正常)。在 Mac 上这样做会将 Chrome 完全最小化到 Dock。如果我再次打开 Chrome,将会出现一个白色的冻结弹出窗口,直到 Chrome 重新启动才会关闭。

我在 Chrominuim 中搜索过类似的错误报告,但结果是空的。

为了重现它,我把它缩小到这个:

test.js:

document.addEventListener('DOMContentLoaded', function ()
{
    window.close();  
});

test.html:

<!DOCTYPE html>
<html>
    <head>
            <script src="test.js"></script>
    </head>
    <body >
        <a>testing</a>
     </body>
</html>

ma​​nifest.json:

    {
  "name": "Test",
  "version": "1.0",
  "description": "None",
  "browser_action": {
    "default_title": "Test",
    "default_popup": "test.html"
  },
  "manifest_version": 2
    }

我也尝试过这样做:

var popups = chrome.extension.getViews({ type: "popup" });
    if (popups.length != 0) 
    {
      var popUpTest = popups[0];
      popUpTest.close();
    }

但得到了相同的结果。

如果我要添加这一行:

setTimeout(function(){window.close()},1000); 

而不是

window.close();

弹出窗口大部分时间都会关闭,但看到弹出窗口一秒钟左右就超出了目的。似乎浏览器在实际关闭它之前等待弹出窗口出现,如果它不存在,它会变得很时髦,并将其最小化。 我设法做到了:

setTimeout(function(){window.close()},35);

但有时我仍然可以看到弹出窗口,有时浏览器会被最小化。绝对不是一个解决方案,但也许它可以帮助你找到一个想法。

【问题讨论】:

  • 您应该在crbug.com/new 上提交一个新错误。您还应该删除“content_scripts”部分,因为我相信它会在 DOMContentLoaded 触发后注入内容脚本,因此不会做任何事情,但它会让调查您的错误的人感到困惑。
  • @JeffreyYasskin 内容脚本根本不会注入扩展页面,因此可以完全删除。事实上,权限部分也可以删除,因为它们也不相关。
  • @JeffreyYasskin 我最终会提交一份错误报告。想确保这是我面临的错误。
  • @RobW 你们都是对的。我更新了我的问题并删除了不必要的代码,并用一些新发现对其进行了更新。
  • @Segev 有什么解决方法,您可以最小化弹出窗口,然后关闭窗口,如有必要,将其放在主窗口后面。

标签: javascript google-chrome google-chrome-extension google-chrome-app


【解决方案1】:

虽然这绝对是 Chrome 中应该报告的错误,但我建议切换到 chrome.windows API。您可以像这样使用 API 关闭当前窗口:

chrome.windows.getCurrent(function(window) {
    var windowId = window.id;
    chrome.windows.remove(windowId);
});

当然,这是假设chrome.windows.getCurrent() 返回的Window 对象 一个id。该字段在 Window 对象中是可选的,因此最好在早期(即窗口的初始创建)提供指定该窗口 id 的代码。

【讨论】:

  • 我认为弹出窗口没有 windowId。它没有被定义为一个窗口。
  • 如果您使用chrome.windows.create() 创建弹出窗口,您应该能够定义一个。我知道必须使用chrome.windows API 重写东西是一件非常痛苦的事情,但这似乎是目前唯一的解决方案。我在 OS X 上使用 Chrome 的窗口管理遇到了很多奇怪的边缘情况,这迫使我之前完全改变了我的 UI 设计。祈祷他们很快就能解决这个问题!
  • 谢谢。如果我这样做,我将创建一个窗口弹出窗口,而不是单击添加按钮后得到的标准弹出窗口,这不是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多