如何在Xpages中检测iFrame

时间:2014-11-28 14:09:49

标签: iframe xpages

我尝试根据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;

我是在正确的轨道上还是有另一种方法可以做到这一点。

1 个答案:

答案 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部分的页面
  • 如果客户端识别该页面已加载到iFrame中
    • 使用网址参数iFrame=yes
    • 对仅限iFrame的面板执行部分刷新
    • 记住iFrame-only面板应在服务器端的viewScope变量中呈现

这是此方法的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>