我尝试根据xpage是否加载到iFrame中来渲染面板。
我的代码看起来像这样
<xp:panel
rendered="#{javascript:return window.self != window.top;}">
</xp:panel>
但是我收到了错误。
Script interpreter error, line=1, col=20: [ReferenceError] 'window' not found
-> 1: return window.self !== window.top;
我是在正确的轨道上还是有另一种方法可以做到这一点。
答案 0 :(得分:2)
面板中的rendered=
代码在服务器端上执行,因此window
不可用。
在客户端执行代码,如果未在iFrame中加载页面,则隐藏元素。
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
if (window == window.top) {
document.getElementById("#{id:panel1}").style.display = 'none';
}]]></xp:this.script>
</xp:eventHandler>
<xp:panel id="panel1">
<xp:text
id="computedField1"
value="#{javascript:'test'}">
</xp:text>
</xp:panel>
如果您不想渲染并稍后隐藏仅限iFrame的部分,您可以使用其他方法:
iFrame=yes
这是此方法的XPage工作示例
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core">
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
if (window != window.top) {
XSP.partialRefreshGet("#{id:panel1}", {
params: {
'iFrame': 'yes'
}
});
}]]></xp:this.script>
</xp:eventHandler>
<xp:panel
id="panel1">
<xp:panel
id="panel2"
rendered="#{javascript:
if (param.iFrame) {viewScope.iFrame = param.iFrame}; viewScope.iFrame}">
<xp:text
id="computedField1"
value="#{javascript:'test'}">
</xp:text>
</xp:panel>
</xp:panel>
</xp:view>