【问题标题】:jquery click event returns true but form is not submittedjquery click事件返回true但未提交表单
【发布时间】:2014-07-20 07:27:37
【问题描述】:

我正在寻求有关如何解决此问题的帮助。以下摘录是表单上“保存”按钮的单击处理程序,该表单具有可变布局,具体取决于要保存的文档类型。使用 jquery 验证,我在自己的自定义对象中设置了不同的规则集,并且一切正常。

此应用程序中的文档都与人员记录相关联,并且在我尝试过的所有其他人员记录中,文档已保存,但在一种情况下,保存按钮触发事件,表单验证没有问题,并且处理程序返回 true。

在 Chrome 中单步执行时,我可以看到事件对象的 defaultprevented false。没有错误输出到控制台。但是回发没有发生。

几乎不可能指望有人能告诉我这里到底出了什么问题,但我不知道下一步该往哪里看。我已经将用于填充表单的存储过程的输出与每个人的 ID 进行了比较,并且没有看到从数据库返回的任何可疑内容。

任何帮助都将不胜感激。

    $(idoc.$.SaveButton).off('click').click(function (e) {
        var rv = true;

        $('.idoc-msg-bar').html('').hide();

        // what kind of document are we saving?
        var docType = $(idoc.$.DocTypeDDL).find(':selected').attr('value');
        // get the DocumentType object that knows what to validate
        var dt = idoc.getDocTypeLayout(docType);

        $('form').validate().settings.rules =  dt.ValidatorRules;
        // debug - dump the rules as the validator sees them
        //for (var r in $('form').validate().settings.rules) 
        //    for (var c in $('form').validate().settings.rules[r])
        //        console.log(r + ' --> ' + c + ' --> ' + $('form').validate().settings.rules[r][c]);

        if ($('form').valid()) {
            // get confirmation to overwrite CV if need be
            if ([idoc.DocType.CVVelosiFormat, idoc.DocType.OriginalCV].indexOf(dt.Value) >= 0) {
                $('.idoc-msg-bar').html(idoc.MSG.CVNotes).addClass('required-rel');

                var chk = $(idoc.$.ChkOverwriteCV);
                if (typeof (chk) != 'undefined') {
                    if ($(chk).is(":visible")) {
                        if ($(chk).is(":checked")) {
                            // proceed to server side validation rules
                        } else {
                            $('.idoc-msg-bar').effect('highlight', {}, 3000);
                            e.preventDefault();
                            rv = false;
                        }
                    }
                    else {

                        $('.idoc-msg-bar').show().effect('highlight', {}, 3000);
                        e.preventDefault();
                        rv = false;
                    }
                }
            }
        }
        else {
            e.preventDefault();
            rv = false;
        }

        return rv;
    });

编辑:

抱歉,是的,我也打算包含 html:

<input type="submit" name="ctl00$ContentPlaceHolder1$tabContainer$tabDocs$uctlDocs$btnDocSave" value="Save" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$tabContainer$tabDocs$uctlDocs$btnDocSave&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_ContentPlaceHolder1_tabContainer_tabDocs_uctlDocs_btnDocSave">

编辑:

因此,将人员记录复制回同一个表中,使其具有不同的 ID,然后使用新 ID 更新所有相关行。我遇到了同样的问题。所以数据中肯定有一些东西把事情搞砸了,对吧?

我正在将相关记录恢复为原始 ID,并重新尝试查看导致问题的记录。它仍然可能是人员记录本身中的一列,但我试图避免一一更新。

【问题讨论】:

  • 您的“保存”按钮也是提交按钮吗? &lt;input type="submit"&gt;?你也可以显示你的 HTML 吗?
  • 为什么要退货?你的 e.preventDefaults 在所有错误的地方应该停止处理表单
  • 这是我的想法。这只是偏执狂,我在那里添加了那些因为我想强制返回 true,以防有什么干扰它。
  • WebForm_DoPostBackWithOptions() 似乎正在处理您的 Save 按钮单击,与您自己的单击处理程序并行。当然,您应该转而使用 WebForm_DoPostBackWithOptions 吗?
  • 您的意思是直接调用它并从非 asp.net 按钮将我自己的回发到服务器端处理程序?我想我可以,但这适用于 5000 条记录中的 4999 条。还有其他想法吗?我已经取得了一些进展,但我会用它来更新问题。

标签: jquery forms button onclick


【解决方案1】:

此字段面板以更大的形式位于选项卡上。其他选项卡之一上的字段使用用户控件,该控件具有切换控件是否具有RequiredFieldValidator 的属性。由于某种原因,这被触发了。由于我的文档表单没有使用 ASP.NET 客户端验证,我只需将“CausesValidation=false”添加到我的文档表单中,问题就消失了。

所以 - 任何有这种怪癖的人 - 检查您的其他控件以进行客户端验证、验证组等,如果您没有使用 ASP.NET 的客户端验证,请在提交按钮上明确将其关闭。可以为您节省 3 天时间和一个新的秃头补丁 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2013-03-12
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多