1

如何在美元托管控件中打开弹出窗口?

Javascript代码

<script>
    function basicPopup(url) {
popupWindow = window.open(url,'popUpWindow','height=300,width=700,left=50,top=50,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no, status=yes')
    }

</script>
<a href="https://www.google.com" onclick="basicPopup(this.href);return false">Open a popup window</a>

美元窗口导航规则

路线类型 - 弹出窗口、操作 - 显示外部、目的地 - 选项卡

托管类型:边缘进程/Chrome 进程。

问题:在浏览器中启动上述 JS 片段时,它按预期工作(弹出窗口以给定尺寸打开,子窗口能够通过 Post 消息与父窗口通信)而与 USD 集成的相同代码,弹出窗口在新选项卡中启动,并且新打开的窗口无法与父窗口通信(window.open() 返回 null)

关于我缺少什么的任何想法?

4

2 回答 2

1

如果您让 USD 托管您的所有浏览器进程并统一您的浏览器类型,您可能能够根据需要访问您的父窗口。

创建一个可以接收目标导航的“目标”/“子”托管控件。让所有浏览器都变成 Chrome,如果你因为某种原因不能这样做,希望你可以把它们全部变成 Edge。在您的 Window Navigation Rule 中,使用操作 Route Window 而不是 Show Outside,并将 Target Tab 设置为新的子浏览器托管控件。如果您不想将子浏览器作为 MainPanel 选项卡托管,请将子浏览器放在 FloatingPanel 上。

另外,不是多余的,但在注意到上面的“Chrome/Edge”混合托管摘要后,我建议尽可能多地消除在整个配置中托管多种浏览器类型。我假设将 USD 托管的浏览器移交给“Windows 托管”浏览器可能会使您找到父窗口的能力复杂化(阻止?)即使 USD 内部和外部的浏览器类型相同。据我所知,USD 和 Windows 使用不同版本的 Edge(USD 尚未集成新的 Edge,而且它可能永远不会)并且 USD 管理自己的 Chromium 实例。我假设 Chrome 中的“显示外部”不会从您的美元应用程序文件夹启动新的 CEF 进程,而只是移交给 Windows,然后调用 Chrome 独立应用程序(如果它是您的操作系统默认浏览器)。如果您出于任何原因致力于“显示外部”范式,那么在这里测试各种浏览器类型组合可能(?)有价值。

于 2021-02-01T00:54:11.993 回答
0

他们可能根本不允许弹出窗口,就像片段中的 SO 一样。

您可以在控制台中查看。

这是一个包含更多信息的版本 - 注意由于沙盒,此版本不会在 SO 弹出任何内容

注意如果内容来自不同的来源,您将无法访问弹出窗口中的内容或弹出窗口中的父

document.getElementById("popupDiv").addEventListener("click", function(e) {
  const tgt = e.target.closest("a");
  if (tgt && tgt.classList.contains("popup")) {
    const popupWindow = window.open(tgt.href, tgt.target, 'height=300,width=700,left=50,top=50,resizable,scrollbars,toolbar,status');
    if (popupWindow) {
      console.log("Popup allowed");
      e.preventDefault(); // cancel the actual link
    } else console.log("Not allowed to pop, target used instead")
  }
})
<div id="popupDiv">
  <a href="https://www.google.com" target="popopWindow" class="popup">Open a popup window</a>
</div>

于 2021-01-29T08:55:29.550 回答