当xsp驻留在iframe中时隐藏控件

时间:2015-09-08 08:17:13

标签: javascript xpages xpages-ssjs

我想在iframe中嵌入xpage时隐藏某些控件。我怎么能这样做?

根据本网站的一些推荐,我试过:

在客户端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>

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你的代码看起来有点奇怪,但也许我没有全面了解。让我把我的答案分成两部分:

第1部分:原始任务的可能解决方案(根据是否属于iframe的一部分隐藏控件 - 或者不是):

只是尝试了一个非常简单的方法:

  1. 构建了一个包含其src属性正在调用的iframe的页面 另一个xsp
  2. src属性还包含一个查询字符串;我用了 “?状态= inIframe”
  3. 还建立了一个自定义控件查询说 的queryString
  4. 证明一切都按预期工作我使用了 CC两次:一次在iFrame调用的xsp内部,一次 直接在主页面内。
  5. 以下是代码:

    CustomControl <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> ;有一个布尔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包括ccInner;布尔CC属性基于<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>

    计算
    document.getElementById()

    “外部”xsp包含iframe定义以及Custom控件的第二个实例,再次根据urlParameter计算CC属性:

    dojo.byId()

    适用于我:CC内的标签显示预期颜色的预期值。

    第2节:关于你的代码的一些评论

    1. 基于dojo的网页中使用XSP.getElementById()据说效率不高;请尝试使用$#
    2. 您使用“${javascript:viewScope.NavBarOption}”代替“#{viewScope.NavBarOption}”(“{{1}}”绑定了您的viewScope onPageLoad指令。是否有特定原因要阻止该值刷新页面时更新?这导致渲染属性将在页面生命周期的多个阶段重新计算,但值只会在页面加载时更新一次。至少可以说不是很有效
    3. 为什么不使用SSJS将范围var绑定到字段而不是像“{{1}}”中那样使用EL?