【问题标题】:JSF form does not get submitted when form is disabled by JavaScript当表单被 JavaScript 禁用时,JSF 表单不会被提交
【发布时间】:2011-02-20 14:26:30
【问题描述】:

这是提交按钮:

<h:commandButton 
    actionListener="#{regBean.findReg}" 
    action="#{regBean.navigate}" value="Search" />

这是表格:

<h:form onsubmit="this.disabled=true;busyProcess();return true;">

如果提交按钮被按下,页面会显示“忙碌”图标,直到请求被处理。问题是,表单永远不会提交,请求永远不会到达后端。但是,如果我改为像这样取出“禁用”调用:

<h:form onsubmit="busyProcess();return true;">

然后一切正常。有什么想法吗?

【问题讨论】:

    标签: java javascript jsf


    【解决方案1】:

    BalusC,您非常有创意的超时选项效果很好。当我在其他浏览器中尝试“禁用”属性时,我实际上得出了相同的结论。它根本没有在 Opera 和 Firefox 中禁用表单。我只是把它归结为那些浏览器比 IE 更通用。

    Sean K,只禁用按钮而不设置超时会产生与表单禁用相同的问题,因为信息被传递到服务器。

    感谢大家的帮助!

    【讨论】:

      【解决方案2】:

      JSF 依赖于提交按钮的名称-值对的存在来调用服务器端的特定操作。如果您在提交表单之前禁用表单(至少是按钮),那么请求参数映射中将没有可用的信息,JSF 将不会调用任何操作。

      最好的办法是引入一个超时,在提交后大约 50 毫秒禁用按钮。例如

      onsubmit="setTimeout(function(){document.getElementById('formId:buttonId').disabled=true;},50);busyProcess();"
      

      最后明确的return true; 顺便说一句是多余的。此外,直接禁用 HTML 表单元素是行不通的,因为它没有 disabled 属性,您想要禁用按钮(以及如果需要其他输入元素)。

      以下是一些改进:

      <h:form onsubmit="busyProcess(this);">
      

      function busyProcess(form) {
          setTimeout(function() {
              for (var i = 0; i < form.elements.length; i++) {
                  form.elements[i].disabled = true;
              }
          }, 50);
      
          // Remnant of your code here.
      }
      

      更新:因为我想知道你说它“有效”,所以我在各种浏览器中测试了表单的 disabled 属性,它只适用于 MSIE(令人惊讶..),但不适用于其他(真实)浏览器。您不想依赖浏览器,所以忘记它并继续禁用表单的各个元素。

      【讨论】:

        【解决方案3】:

        如果您希望用户不提交任何内容,请在表单上方显示一个图层并从活动组件中移除焦点。

        另一种方法是确保 AJAX 请求使用一个公共通道,该通道具有一个队列,一次只处理一个请求(易于使用原型等框架)

        【讨论】:

          【解决方案4】:

          您已禁用整个表单,只需禁用按钮即可。

          您还需要确保您的busyProcess() 返回一个真实值,否则提交也可能被禁用。

          【讨论】:

          • 他想禁用触发第二次提交的所有途径 - “Enter”键等。
          【解决方案5】:

          我很确定禁用整个表单对浏览器意味着您不希望它可提交。当您禁用单个输入元素时,这些元素不会包含在表单发布时发送到服务器的参数中。

          【讨论】:

            【解决方案6】:

            this.disabled = true改成[buttonref].disabled = true

            【讨论】:

            • 感谢您的回答...但这只会禁用按钮,对吗?如果我想禁用整个页面怎么办?另外,你知道为什么这不起作用吗?
            • 你的意思是整个表格?然后你需要在返回 true 后这样做,例如使用 var a = this; setTimeout(function(){a.disabled = true;},0);return true
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-20
            • 1970-01-01
            • 1970-01-01
            • 2019-06-30
            • 2012-02-23
            相关资源
            最近更新 更多