【问题标题】:How to make sure only one h:selectOneRadio button is selected如何确保只选择一个 h:selectOneRadio 按钮
【发布时间】:2012-08-22 16:56:45
【问题描述】:

我有一些 javascript 代码(我从 BalusC 借来的)用于确保在表格中只选择一个 h:selectOneRadio 按钮。不幸的是,我的 glassfish 服务器出现格式错误的表达式错误:

Error Parsing /ClientSearch.xhtml: Error Traced[line: 13] The content of elements must consist of well-formed character data or markup.

注意:

 if (elements[i].name.substring(elements[i].name.lastIndexOf(':')) == id) {

似乎是问题所在

我也不完全理解javascript(我是新手),我希望有人可以向我解释。

这里是完整的 javascript:

 function dataTableSelectOneRadio(radio) {
    var id = radio.name.substring(radio.name.lastIndexOf(':'));
    var elements = radio.form.elements;
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].name.substring(elements[i].name.lastIndexOf(':')) == id) {
            elements[i].checked = false;
        }
    }
    radio.checked = true;
}
 </script>  

为什么我会收到错误消息? 而且,脚本本身似乎是错误的。如果不等于 id 则代码不应该为 false (如下所示)。

 if (elements[i].name.substring(elements[i].name.lastIndexOf(':')) != id) {
    elements[i].checked = false;
 }

显然我不明白。

这里是表格的 facelets 代码: 客户

        <h:column headerText="First Name"  >
            <f:facet name="header"><h:outputText value="First Name" /></f:facet>
            #{client.firstName}
        </h:column>
        <h:column headerText="Last Name"  >
            <f:facet name="header"><h:outputText value="Last Name" /></f:facet>
            #{client.lastName}
        </h:column>

        <h:column headerText="Select"  >
            <f:facet name="header"><h:outputText value="Last Name" /></f:facet>
            <h:selectOneRadio valueChangeListener="#{clientSearchBean.setSelectedItem}" >
                <f:selectItem itemValue="null" />
            </h:selectOneRadio>
        </h:column>

        <h:column headerText="Address"  >
            <f:facet name="header"><h:outputText value="Address" /></f:facet>
            #{client.address}
        </h:column>
        <h:column headerText="Cell"  >
            <f:facet name="header"><h:outputText value="Cell" /></f:facet>
            #{client.cell}
        </h:column>
        <h:column headerText="Phone"  >
            <f:facet name="header"><h:outputText value="Phone" /></f:facet>
            #{client.phone}
        </h:column>

    </h:dataTable>      

【问题讨论】:

    标签: javascript jsf jsf-2


    【解决方案1】:

    我已经尝试(并且正在使用)&lt;h:dataTable&gt; 中的 BalusC 代码,并且运行良好。你有两个问题:

    1. 您根本没有使用 JavaScript 函数(或者在您的代码中看起来):

      <h:column headerText="Select">
          <f:facet name="header">
              <h:outputText value="Last Name" />
          </f:facet>
          <!-- you forgot to add the onclick -->
          <h:selectOneRadio valueChangeListener="#{clientSearchBean.setSelectedItem}"
              onclick="dataTableSelectOneRadio(this);">
              <f:selectItem itemValue="null" />
          </h:selectOneRadio>
      </h:column>
      
    2. 您的 JavaScript 代码具有 &lt; 符号。 Facelets 对这个符号的使用非常严格。要使其正常工作,您应该在Script and Style elements 中使用XML CDATA 用法:

      <script type="text/javascript">
      //the CDATA must be used with JavaScript comments
      //<![CDATA[
          function dataTableSelectOneRadio(radio) {
              var id = radio.name.substring(radio.name.lastIndexOf(':'));
              var elements = radio.form.elements;
              for (var i = 0; i < elements.length; i++) {
                  if (elements[i].name.substring(elements[i].name.lastIndexOf(':')) == id) {
                      elements[i].checked = false;
                  }
              }
              radio.checked = true;
          }
      //]]>
      </script>
      

    【讨论】:

    • 感谢 Luiggi,您的 CDATA 建议消除了错误消息。而且,是的,我忘记在发布的代码中包含 onclick 事件。我早些时候有它,但在摆弄时我把它丢在了某个地方。但是现在 javascript 函数不会执行(我把 onclick 事件放回去了)。该页面似乎不知道它在那里。有什么想法吗?
    • @Dave 不执行 JavaScript 方法或者它执行但抛出未处理的异常?对您的问题进行进一步调查,如果您发布 HTML 生成的页面,我可以为您提供更好的指导。
    • 通过以这种方式将 global.js 文件(具有该功能)复制到我的 .xhtml 中来使其工作 - 但是当我简单地将函数放入 .xhtml 文件并将其声明为脚本时,它不起作用。有什么想法吗?
    • @Dave 我已经更新了我的问题,用 Javascript // 字符编辑 CDATA 部分,然后重试。
    • 好的,就是这样。接下来,深入了解 javascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2012-04-23
    • 2011-08-13
    • 2018-06-17
    相关资源
    最近更新 更多