我想在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>
我做错了什么?
答案 0 :(得分:0)
你的代码看起来有点奇怪,但也许我没有全面了解。让我把我的答案分成两部分:
第1部分:原始任务的可能解决方案(根据是否属于iframe的一部分隐藏控件 - 或者不是):
只是尝试了一个非常简单的方法:
以下是代码:
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节:关于你的代码的一些评论
XSP.getElementById()
据说效率不高;请尝试使用$
或#
。${javascript:viewScope.NavBarOption}
”代替“#{viewScope.NavBarOption}
”(“{{1}}”绑定了您的viewScope onPageLoad指令。是否有特定原因要阻止该值刷新页面时更新?这导致渲染属性将在页面生命周期的多个阶段重新计算,但值只会在页面加载时更新一次。至少可以说不是很有效