叠加图像不显示
Overlay image doesn't display
这是一个JSF 2.0 + Primefaces 3.5应用程序。我有一个弹出对话框确认删除所选项目。一旦用户选择确认,javascript就会生成2个div作为覆盖层:一个是半透明层,另一个是旋转车轮gif图像。一旦后端删除过程完成(需要几秒钟),页面就会刷新,覆盖层就会消失。
这是我的对话框代码,我使用primefaces对话框标签: <p:dialog id="confirmRemove"
header="Remove Confirmation" severity="alert"
widgetVar="confirmation" modal="true" resizable="false">
<h:panelGrid columns="1">
<h:panelGroup id="message">
<h:outputText id="confirmMsg"
value="Are you sure you want to remove the selected item?" escape="false"/>
</h:panelGroup>
<p:commandButton id="confirm" value="Remove"
onclick="confirmation.hide();loadOverlay()"
actionListener="#{myBackingBean.addInfo()" ajax="false"/>
</h:panelGrid>
</p:dialog>
下面是我的javascript代码:
function loadOverlay()
{
var overlay = jQuery('<div id="overlay"d></div>');
overlay.appendTo(document.body);
var overlay_img = jQuery('<div id="overlay_img"><img src="../images/spinning-wheel.gif"/></div>');
overlay_img.appendTo(document.body);
}
下面是我的样式表:
#overlay {
position:fixed;
top: 0;
width: 100%;
height: 100%;
background-color: #000;
filter:alpha(opacity=50);
-moz-opacity: 0.5;
-khtml-opacity: 0.5;
opacity: 0.5;
z-index: 10000;
}
#overlay_img {
position: absolute;
top: 50%;
left: 50%;
opacity: 1.0 !important;
z-index: 10001;
}
我的问题是:一旦确认对话框的删除按钮被点击,叠加显示,但不是图像。如果我在javascript函数loadoverlay()的末尾添加一个警告语句,那么图像就会显示出来。另外,如果我将p:commandButton ajax="false"更改为ajax="true"(默认模式),图像也会显示出来。但显然,这不会工作,这意味着我必须手动刷新页面,使覆盖消失。我也不认为这和Primefaces有什么特别的关系。我尝试使用JSf标签h:commandButton,观察到同样的问题。
我只是想补充一下,如果我使用调试器(firebug)来检查loadOverlay的原始代码,图像也会正常显示。
我还做了一个实验,在loadOverlay函数的末尾添加一个循环运行1秒。如果我在没有调试器的情况下运行,在点击"删除"按钮后,页面会冻结一秒钟,然后再继续部署覆盖层(没有图像)。但是如果我用调试器运行它,结果将在语句执行后立即显示在屏幕上。例如,在语句"overlay. appendto (document.body)"之后,覆盖将立即被部署。这让我觉得调试器非常不可靠:这似乎表明调试器运行在与实际交易不同的流上。
我一直在Firefox(20.0)上测试我的代码。我刚刚在IE(8)上尝试过,令我惊讶的是,它在IE上运行得很好。这是浏览器的问题
我更喜欢使用页面刷新来摆脱覆盖,因为这是一个更干净的解决方案。但由于这对Firefox不起作用,所以我不得不采用Ajax解决方案。将对话框代码更改为:
<p:dialog id="confirmRemove"
header="Remove Confirmation" severity="alert"
widgetVar="confirmation" modal="true" resizable="false">
<h:panelGrid columns="1">
<h:panelGroup id="message">
<h:outputText id="confirmMsg"
value="Are you sure you want to remove the selected item?" escape="false"/>
</h:panelGroup>
<p:commandButton id="confirm" value="Remove"
onclick="confirmation.hide();loadOverlay()"
oncomplete="removeOverlay();"
actionListener="#{myBackingBean.addInfo()}" />
</h:panelGrid>
</p:dialog>
所以基本上将p:commandButton更改为Ajax按钮,并添加一个javascript函数(removeOverlay),以便在过程完成后删除覆盖。removeOverlay函数如下:
function removeOverlay() {
element = document.getElementById('overlay_img');
element.parentNode.removeChild(element);
element = document.getElementById('overlay');
element.parentNode.removeChild(element);
}
- 使用JSP从服务器检索和显示图像
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 使用FormData上传AJAX图像;t在服务器端显示图像
- 选择文件后显示图像
- Chrome(webkit?)无法在幻灯片中正确显示图像
- 如何使用javascript显示图像
- 使用JS按顺序显示图像,而不是随机显示
- 使用服务器上的HTML/js在网页上显示图像
- 我想在选择输入文件上显示图像
- Javascript:单击单选按钮时显示图像
- 如何将JSON结果设置为'src'共'img'以在ASP.NET MVC4中显示图像
- 无法在cakepp布局中显示图像
- 页面加载后通过javascript显示图像
- 将图像文件存储在猫鼬模式中的二进制数据中,并以html形式显示图像
- 使用AngularJs数据绑定的三元运算符显示图像
- 加载时画布上未显示图像
- 运行POST时显示图像
- NodeJS上没有显示图像
- 从Javascript在表中显示图像
- 如何在MVC5中运行时在HTML5 Canvas中显示图像