2014-11-28 4 views
2

Я пытаюсь отобразить панель в зависимости от того, загружается ли xpage в iFrame или нет.Как обнаружить iFrame в Xpages

Мой код выглядит примерно так

<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; 

Я нахожусь на правильном пути или есть другой способ сделать это.

ответ

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
    • выполнить частичное обновление для iFr AME-только панель с параметром URL iFrame=yes
    • запомнить, что плавающий фрейм только панели должны быть выведены в переменной 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> 
+0

Tnx Knut, только необходимый мне вход –