【发布时间】:2016-12-10 09:14:27
【问题描述】:
我正在开发 PrimeFaces 6.0、JSF 2.2 (Mojarra 2.2.7) 应用程序。
我需要从外部站点加载网页并突出显示 DOM 节点。我的方法是创建一个 JavaScript 函数来打开一个弹出窗口,通过 servlet 加载网页(以避免跨域问题)并突出显示节点。我发送给我的函数的参数是在托管 bean 中生成的。
我尝试了两种不同的方式:
- 在我的操作中使用
RequestContext.getCurrentInstance().execute("myFunction(...)")(是的,我正在使用 PrimeFaces)。 - 在我的命令按钮上使用
oncomplete="#{myBean.myJsCall}"。
两种方式都执行调用并且调用正确,但我遇到了浏览器的 (Chromium) 弹出窗口拦截器:
有没有办法在 JSF 或特别是 PrimeFaces 中打开弹出窗口而不会被阻止?
这并不重要,但这是我的 JavaScript 函数的简化版本。
我使用纯 HTML 和 JS 开发了这个脚本。在那里,它在没有阻止程序干扰的情况下打开弹出窗口。此外,在运行 JSF 应用程序时将调用粘贴到控制台时,会打开弹出窗口。
function myFunction(url, selector) {
var popup = window.open("", "popup", "height=500,width=700");
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.onreadystatechange = function() {
if (req.readyState === XMLHttpRequest.DONE) {
popup.document.open();
popup.document.write(req.responseText);
popup.document.close();
popup.document.addEventListener(
"DOMContentLoaded",
function() { /* Some code highlighting the selector */ },
false
);
}
}
req.send();
}
【问题讨论】:
-
这与 JSF 或 PrimeFaces 无关。这是一个纯粹的客户端 html 问题。在这种情况下最好使用 PrimeFaces 对话框
-
我使用纯 HTML / JS 开发了脚本。它在那里工作。将调用粘贴到控制台也可以。当然,您不能为此“责备” JSF,但我希望有一个“解决方法”。在这种情况下,对话框不是选项。内容是从外部站点加载的,它希望与 CSS 混合。
-
在没有用户交互的情况下从同一页面客户端打开多个弹出窗口/打开新窗口(这是您明确执行的操作)将导致这些响应(是我的经验)可能仅在几个电话。但是我怀疑您在从服务器响应中执行时会直接收到此消息。我看到的一种选择是使用普通的 div 并将其置于屏幕中心并在其中显示
req.responseText。但是,如果您特别需要一个新窗口,那么我不会想到什么。 -
好的,谢谢。我会将我的一些操作逻辑复制到 JavaScript 并读取那里的值,以便我可以使用它
onclick。这与我在纯 HTML / JS 中遇到的情况相同。 -
好好调查!!!
标签: javascript jsf primefaces popup popup-blocker