скрий контрола, когато xsp се намира в iframe

Бих искал да скрия определени контроли, когато xpage е вградена в iframe. Как мога да направя това?

Въз основа на някои препоръки на този сайт опитах:

В JavaScript от страна на клиента имам на разположение:

<xp:eventHandler event="onClientLoad" submit="false">
        <xp:this.script><![CDATA[if (window.frameElement) {
  //in iframe
  var field = document.getElementById("#{id:NavBarOption}");
  alert(field.id)
  field.value = "hide";
}
else {
  //NOT in iframe
  var field = document.getElementById("#{id:NavBarOption}");
   alert(field.id)
  field.value = "";
}]]></xp:this.script>
</xp:eventHandler>

Това трябва да зададе контрола на полето за въвеждане, която има частично опресняване в събитието onchange за:

<xp:inputText id="NavBarOption"
        value="${javascript:viewScope.NavBarOption}">
        <xp:this.attrs>
            <xp:attr name="type" value="hidden"></xp:attr>
        </xp:this.attrs>
        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="body" immediate="true"
            execMode="partial" execId="body">
        </xp:eventHandler>
    </xp:inputText>

Контролата на полето за въвеждане е обвързана с променлива на обхвата. Този обхват Variabel ще се използва в контроли или персонализиран контрол за изобразеното свойство, напр.:

<xc:ccNavBar id="ccNavBar">
            <xc:this.rendered><![CDATA[#{javascript:return true;
var hide = viewScope.showNavBar;

if (hide !=""){
    //return false;
}
else{
    //return true;
}}]]></xc:this.rendered>
        </xc:ccNavBar>

Какво правя неправилно?


person Patrick Kwinten    schedule 08.09.2015    source източник


Отговори (1)


Вашият код изглежда малко странен, но може би не получавам цялата картина. Позволете ми да разделя отговора си на две части:

Раздел 1: възможно решение за първоначалната ви задача (скрийте контролите въз основа на факта дали са част от iframe - или не):

просто опитах с много прост подход:

  1. създаде страница, включваща iframe, чийто src атрибут извиква друг xsp
  2. атрибутът src също съдържа низ за заявка; Използвах "?status=inIframe"
  3. също изгради персонализирана контрола, заявяваща въпросния queryString
  4. за да докажа, че всичко работи според очакванията, използвах CC два пъти: веднъж в xsp, извикан от iFrame, и веднъж директно в главната страница.

Ето кода:

CustomControl ccInner; има булево CC свойство "isInIframe":

<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:panel
        id="pnInnerContainer">
        <xp:label
            id="label1">
            <xp:this.value><![CDATA[#{javascript:compositeData.isInIframe?"I'm inside an iframe":"I'm outside an iframe"}]]></xp:this.value>
            <xp:this.style><![CDATA[#{javascript:compositeData.isInIframe?"color:red;":"color:blue;"}]]></xp:this.style>
        </xp:label>
    </xp:panel>
</xp:view>

„Вътрешният“ xsp включва ccInner; булевото свойство CC се изчислява въз основа на context.getUrlParameter("status"):

<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom">
    <xc:ccInner>
        <xc:this.isInIframe><![CDATA[#{javascript:context.getUrlParameter("status")=="iniframe"?true:false}]]></xc:this.isInIframe>
    </xc:ccInner>
</xp:view>

„Външният“ xsp съдържа дефиницията на iframe, както и 2-ро копие на персонализираната контрола, като отново изчислява свойството CC въз основа на urlParameter:

<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom">
    <xp:panel
        id="iframeContainer"
        style="padding:10px;border:1px grey solid;">
        <iframe
            id="myIframe"
            frameborder="0"
            style="width:300px;height:30px;border:1px red solid;padding:5px;"
            src="testinnerifr.xsp?status=iniframe">
        </iframe>
        <xc:ccInner>
            <xc:this.isInIframe><![CDATA[#{javascript:context.getUrlParameter("status")=="iniframe"?true:false}]]></xc:this.isInIframe>
        </xc:ccInner>
    </xp:panel>
</xp:view>

Работи добре за мен: етикетът вътре в CC показва очакваната стойност в очаквания цвят.

Раздел 2: някои забележки относно вашия код

  1. използването на document.getElementById() в доджо базирани страници се смята за не много ефективно; опитайте да използвате dojo.byId() или XSP.getElementById() вместо това.
  2. вие обвързвате вашата директива viewScope onPageLoad, като използвате "$" вместо "#" ("${javascript:viewScope.NavBarOption}". Има ли конкретна причина, поради която искате да предотвратите актуализирането на стойността при опресняване на страницата? Това води до факта, че изобразеното свойство ще бъде преизчислена по време на множество фази от жизнения цикъл на вашата страница, но стойността ще се актуализира само веднъж при зареждане на страницата. Меко казано, не е много ефективно
  3. И защо не свържете променливата на обхвата към полето, като използвате SSJS, вместо да използвате EL, както в "#{viewScope.NavBarOption}"?
person Lothar Mueller    schedule 08.09.2015