仅使用CSJS获取单选按钮组值

时间:2014-04-21 20:24:39

标签: javascript html xpages

我读过similarly entitled article,但它并没有真正提供客户端解决方案。

我有一个单选按钮组,用于确定其他内容是否可见或隐藏。我有代码将在xp:scriptBlock中检索此RBGroup的值。

function getPTValue (bName) {
var pt=null;
for(var i=0; i<document.forms[0].elements.length; i++){
 if(document.forms[0].elements[i].name=="#{id:PayType}" ){
  if(document.forms[0].elements[i].checked == true){
   pt=document.forms[0].elements[i].value;
   break; //remove this if for check box groups and collect multiple values above instead
  }
 }
}
 return pt
}

这是单选按钮组;

<xp:radioGroup
 id="PayType" 
 value="#{FInvoiceDoc.PayType}" 
 defaultValue="Hourly" 
 style="color:rgb(0,0,0)">
 <xp:selectItem itemLabel="Hourly" itemValue="Hourly"> </xp:selectItem>
 <xp:selectItem itemLabel="Fixed" itemValue="Fixed"></xp:selectItem>
 <xp:eventHandler event="onclick" submit="true" refreshMode="norefresh">            
  <xp:this.script><![CDATA[payTypeVis();]]></xp:this.script>
 </xp:eventHandler>
</xp:radioGroup>

当文档处于编辑模式时,这很有用,但是如果我以只读模式打开它,则会执行上述例程,但不会返回单选按钮组的值。

似乎在读取模式下,它将payType单选按钮组显示为准计算字段。没有按钮,只有价值。我尝试使用XSP.getElementById(“#{id:payType}”)。innerHTML检索它,我得到了值,但周围有很多HTML标签。 (.value什么都不返回)

如何使用严格的CSJS在读取模式下正确检索文档上的单选按钮组值?

3 个答案:

答案 0 :(得分:2)

在读取模式下,字段的值不会改变,因此在读取模式下处理它时,使用“脚本块”控件设置CSJS变量并直接从绑定字段中提取。 Script Block控件允许您运行SSJS / Java,因此: var invDocPayType =“#{javascript:FInvoiceDoc.PayType}”;

设置呈现属性,使其仅显示文档是否处于读取模式,因此: if(view.isRenderingPhase())!FInvoiceDoc.isEditable();

然后在CSJS中,检查该变量是否存在(即您处于读取模式),否则直接从单选按钮中获取值。

答案 1 :(得分:0)

我可以想到(可能的)解决方案和解决方法。

(可能的)解决方案是启用&#34; showReadonlyAsDisabled&#34;你的电台组的财产。通过(可能)我的意思是我不能100%确定这是否存在于无线电组。但如果确实如此,你的控制权应该被表现为&#34;控制&#34;使用html标记中的值,使用&#34; readOnly&#34;属性适用于它。在明天早上之前无法对此进行测试。

如果这不起作用,您还可以使用无线电组的onchange事件将您的值复制到隐藏字段,然后读取该辅助字段的值,该值应该更容易检索。

更新
只是尝试了一下:&#34;(可能)&#34;遗憾的是,对于无线电小组来说,解决方案是不可能的,所以忘了它。

你很可能会遇到其他解决方案,正如我的第二个选项中所述,或者@stwissel描述它(他的选项#1)。我的解决方法看起来有点像这样:

我的radioGroup绑定到名为rbGroup的字段。在名为rbvalue的同一表单上还有一个简单的数据字段,在Xpage上我有一个绑定到rbvalue的editBox控件,它通过css display:none语句隐藏。对于这个editBox,我将showReadonlyAsDisabled属性设置为true(对于editBoxes,这是有效的):

    <xp:inputText
        id="rbGrpHelper"
        value="#{doc1.rbValue}"
        showReadonlyAsDisabled="true">
    </xp:inputText>

我的radioGroup的onchange事件处理程序执行一些简单的代码,将无线电的选定值复制到rbvalue,并对包含rbGrpHelper的div执行部分刷新编辑框:

doc1.replaceItemValue("rbValue", doc.getItemValue("rbGroup"))

现在,如果我的xpage在读取模式下打开,由于showReadonlyAsDiabled属性,我的隐藏辅助字段在其HTML标记中显示如下:

<input type="text" 
  value="1" id="view:_id1:rbGrpHelper" 
  name="view:_id1:rbGrpHelper" 
  readonly="readonly" 
  style="display:none" 
  class="xspInputFieldEditBox">

这样rbGrpHelper始终是最新的,您可以使用CSJS代码访问所选值。

答案 2 :(得分:0)

简短:不要 Long:根据表单的性质,只读模式中没有输入元素,如单选按钮,输入框等。您有一系列选项:

  1. 您确实将您的广播组绑定到#{FInvoiceDoc.PayType},因此您可以计算一个隐藏字段(使用像<xp:text value="&lt:input type=\"hidden\" value=\"#{FInvoiceDoc.PayType}\"" escape="false"></xp:text>这样的passthrou计算文本。然后只需使用该值客户端

  2. 如果你甚至需要在阅读模式下切换,你也需要计算无线电组,因此它是可切换的

  3. 使用一组SSJS函数showSection_InterestingName(doc) {....}计算值true / false以显示处于读取模式的部分(或使用showSection(doc, sectionName)。这样就可以从显示中抽象出计算结果

  4. 之后很容易为开发者阅读

    希望有所帮助