HTML瞬态模态窗口

达比乔

我们有一个旧版Web应用程序。在Firefox上的Privilege Manager的帮助下,它在各个地方打开一个窗口,以获取所需的结果。其中一些窗口可打开Java applet或PDF文档。客户端计算机正在更新Firefox,特权管理器消失了。

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

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

  2. 如果再次打开窗口(通过用户操作),则不应重新加载该窗口,而应集中精力将其置于前台(我已经知道可以在JavaScript上保留对该窗口的引用)

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

有谁知道如何做到这一点?

客户端仅是Linux上的Firefox(可在特殊的信息亭配置中使用)。

我读过某处我可以写某种扩展的地方,但是基本上我对扩展及其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);

现在,也许我缺少一些安全检查,如果源于同一主机的代码可以正常工作,以及如何处理对请求对话框的文档的引用,以作为对话框窗口与打开器之间的交互方式。

麦延

权限管理器在Firefox 12弃用,在Firefox 17除去简要地恢复)。

您可能需要调查Window.showModalDialog()但是,它已过时,并且如果您使用Firefox 38的扩展服务版本(ESR),则预计在一年内或在2016年消失。在您开发扩展程序时,它可能是一个临时解决方案。

为了完成相同的任务,您将需要编写一个扩展并要求用户安装它(来自“绕过安全限制和签名代码”,这是有关Privilege Manager的旧信息):

现在,需要其他权限的网站应要求Firefox用户安装扩展程序,该扩展程序可以在需要时与非特权页面进行交互

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

  1. XUL覆盖
  2. 重启/启动
  3. 附加SDK

对于前两种类型,您可以使用window.open()modal选项位于“要求特权的功能”中您可能还会想看看Window.openDialog()

对于附加SDK,通常应使用open()SDK的window / utils模块中的功能。再一次,您可能需要看一下openDialog()

在这些模式窗口中,您似乎正在打开从Web提供的内容。您不太可能会批准将扩展程序托管在AMO上,而该扩展程序会在此类窗口中打开内容,而这些窗口未包含在附加发行版中。这并不意味着您无法开发扩展并将其安装在信息亭客户端上,而无需在AMO上进行托管。但是,今年Firefox的开发存在其他限制,这将使这变得更加困难,请参阅:“引入扩展签名:更安全的附加体验”

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章