我正在尝试根据 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;
我走在正确的轨道上还是有其他方法可以做到这一点。
最佳答案
面板中的 rendered=
代码在服务器端执行,因此窗口
不可用。
在客户端执行代码,如果页面未在 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 部分的页面
- 如果客户端识别出该页面是在 iFrame 中加载的
- 使用 URL 参数对仅限 iFrame 的面板执行部分刷新
iFrame=yes
- 记住仅 iFrame 面板应在服务器端的 viewScope 变量中呈现
- 使用 URL 参数对仅限 iFrame 的面板执行部分刷新
这是此方法的 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>
关于iframe - 如何在 Xpages 中检测 iFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190473/