gpt4 book ai didi

javascript - HTML transient 模态窗口

转载 作者:行者123 更新时间:2023-11-30 10:06:11 25 4
gpt4 key购买 nike

我们有一个遗留的网络应用程序。在不同的地方,它在 Firefox 上的权限管理器的帮助下打开一个窗口以获得所需的结果。其中一些窗口会打开 Java 小程序或 PDF 文档。客户端计算机正在更新 Firefox,而权限管理器已消失。

最简单的解决方法是什么?问题是:

  1. 在任何时候都必须只有一个弹出窗口实例。这可以通过在 window.open() 调用中选择适当的窗口名称来完成。

  2. 如果窗口再次打开(通过用户操作),它不应该重新加载,而只是专注于将它带到前台(我已经看到我可以在 JavaScript 上保留对窗口的引用来做到这一点)

  3. 它基本上必须是 transient /模态的,这样客户端才能在不先关闭子窗口的情况下离开当前页面或重新加载或与父窗口进行任何其他类型的交互(打开/重新聚焦子窗口除外)。我不知道该怎么做。

有人知道怎么做吗?

客户端只是 Linux 上的 Firefox(它在特殊的 kiosk 配置中工作)。

我在某处读到我可以以某种方式编写扩展,但我对扩展及其 API 基本上一无所知。

编辑1:

(简化的)遗留代码示例。不确定是否需要所有权限,但就是这样:此函数打开一个位于父窗口上方的窗口,并阻止用户与父窗口进行任何交互。

function fWindowOpen(url, name) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
netscape.security.PrivilegeManager
.enablePrivilege("CapabilityPreferencesAccess");
netscape.security.PrivilegeManager
.enablePrivilege("UniversalPreferencesWrite");
netscape.security.PrivilegeManager
.enablePrivilege("UniversalPreferencesRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
window.open(
url,
name,
"screenX=70,dependent=yes,menubar=0,toolbar=0,width=900,height=700,modal=1,dialog=1"
);
}

function fnCapture(){
fWindowOpen("/path/to/document_or_japplet/page","_blank");
}

HTML:

<button value="Capture" property="btnCapture" onclick="javascript:fnCapture();"/>

Edit2:解决方案

在典型的扩展上,在 xul 代码上,定义这个 javascript 代码:

var dialogExt = {
listener: function(evt) {
// Do work with parameters read through evt.target.getAttribute("attribute_name")
window.openDialog(evt.target.getAttribute("url"), evt.target.getAttribute("name"), evt.target.getAttribute("features"));
}
}
// from examples
document.addEventListener("dialogExtEvent", function(e){ dialogExt.listener(e); }, false, true);

然后,在网页上:

var element = document.createElement("dialogExtElement");
element.setAttribute("url", url);
element.setAttribute("name", name);
element.setAttribute("features", features);
document.documentElement.appendChild(element);
var evt = document.createEvent("Events");
evt.initEvent("dialogExtEvent", true, false);
element.dispatchEvent(evt);

现在,如果代码来自同一主机,我可能缺少一些安全检查来让代码工作,以及如何处理对请求对话框的文档的引用,作为对话框窗口和它的打开器之间的交互方式。

最佳答案

Privilege Managerdeprecated in Firefox 12 and removed in Firefox 17 (briefly restored)。

您可能想查看 Window.showModalDialog() .但是,它已被弃用,预计将在今年内消失,如果您使用 Firefox 38 的扩展服务版本 (ESR),则可能会在 2016 年消失。这可能是您开发扩展时的临时解决方案。

为了完成相同的任务,您需要编写一个扩展并要求用户安装它(来自 Bypassing Security Restrictions and Signing Code,关于权限管理器的旧信息):

Sites that require additional permissions should now ask Firefox users to install an extension, which can interact with non-privileged pages if needed.

可以使用三种不同的扩展类型中的任何一种来编写这样的扩展:

  1. > XUL overlay
  2. > Restartless/Bootstrap
  3. > Add-on SDK

对于前两种类型,您可以使用 window.open() . modal 选项在 "Features requiring privileges" 中.您可能还想看看 Window.openDialog() .

对于附加 SDK,您通常会使用 open() SDK 中的函数 window/utils模块。在这里,您可能还想看看 openDialog() .

您可能正在这些模态窗口中打开从 Web 提供的内容。您不太可能获得批准在 AMO 上托管的扩展程序这会在此类窗口中打开不包含在附加版本中的内容。这并不意味着您不能开发扩展并将其安装在您的自助服务终端客户端上,而无需将其托管在 AMO 上。然而,今年 Firefox 的开发有额外的限制,这将使这变得更加困难,请参阅:"Introducing Extension Signing: A Safer Add-on Experience" .

关于javascript - HTML transient 模态窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com