【问题标题】:How do I stop a RegularExpressionValidator firing when used with onblur()?与 onblur() 一起使用时,如何停止 RegularExpressionValidator 触发?
【发布时间】:2021-03-13 20:55:36
【问题描述】:

我需要在文本框中显示数以千计的逗号分隔符格式的数字。每个文本框都是这样的:

 <asp:TextBox ID="txtNumber" MaxLength="16" runat="server" onfocus="unFormatTextBox(this);" onblur="formatTextBox(this);" />

绘制页面时,数字在服务器端格式化,因此 1000.50 将变为 1,000.50,并将其设置为文本框值。

当用户点击文本框时 - 为了便于编辑 - 逗号被删除。

function unFormatTextBox(elementId) {

    // removes commas on focus

    var num = elementId.value;
    elementId.value = num.replaceAll(',', '');

}

当用户点击其他地方并且文本框失去焦点时,条目被重新格式化并重新插入逗号..

function formatTextBox(elementId) {

    // add commas on mouseout
    var num = elementId.value;

    var parts = num.toString().split(".");
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    elementId.value = parts.join(".");

}

这非常有效。但是它与 RegularExpressionValidator 冲突..

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtNumber" ErrorMessage="" ValidationExpression="^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?$">*</asp:RegularExpressionValidator>

所以用户键:

1500

当文本框失去焦点时,例如他们点击到下一个,它被重新格式化为:

1,500

问题:验证器随后触发并显示条目不正确,即使它应该没问题。验证器应该允许该条目带有逗号(然后我在处理提交的值之前删除该服务器端)。

但是,如果用户随后单击“提交”,您可能会认为这将不起作用,因为字段被突出显示为无效 - 实际上,它确实起作用并且页面提交。

谁能帮助解释为什么会发生这种情况以及如何阻止它?非常感谢。

【问题讨论】:

  • 只是为了澄清一点:用户密钥 1,500 - 验证器触发并指示不正确的值。即便如此:表单仍将提交。用户密钥 ABCD - 验证器触发并且表单将提交。验证者的行为在这方面是正确的。问题是该字段实际有效时在屏幕上突出显示。

标签: javascript asp.net regex validation


【解决方案1】:

检查keyup 事件并在输入时更新格式如何?

    $('input.number').keyup(function(event) {
      // skip arrow keys
      if(event.which >= 37 && event.which <= 40) return;
    
      // format number
      $(this).val(function(index, value) {
        return value
        .replace(/\D/g, "")
        .replace(/\B(?=(\d{3})+(?!\d))/g, ",")
        ;
      });
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<input class="number" id="id_" name="id_" type="text">

参考:https://stackoverflow.com/a/2632502/8291949

【讨论】:

  • 谢谢。我敢肯定,那会奏效。但是,我需要准确地反映另一个应用程序的行为,并且只有在它失去焦点时才会重新格式化该字段。这是因为 - 我认为 - 存在的逗号妨碍了轻松编辑值,因此在编辑时需要删除它,并且只有在用户完成编辑并移动到另一个字段后才能恢复。
  • 嗯,如果行为无法改变,而事件顺序保持不变,那将很难改进。您可以通过将,? 设为可选来削弱正则表达式验证器,但这基本上会使检查变得无用。
【解决方案2】:

解决方案是更改正则表达式:

<asp:RegularExpressionValidator ID="RegularExpressionValidator8" runat="server" ControlToValidate="txtProductQuantity" ErrorMessage="*" CssClass="fvError" Display="Dynamic" ValidationExpression="^(?:[0-9]+(?:[.,][0-9]+)?|[1-9][0-9]{0,2}(?:(?:\.[0-9]{3})*|(?:,[0-9]{3})*)(?:\.[0-9]+)?)$">*</asp:RegularExpressionValidator>

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2020-11-07
    • 2013-07-13
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多