【问题标题】:Validation error message appears before anything is typed in the text box在文本框中输入任何内容之前出现验证错误消息
【发布时间】:2015-01-12 00:35:17
【问题描述】:

我正在尝试使用 jQuery 添加一些验证。我有一个现有号码,当用户输入一个新号码时,它必须大于现有号码。

这是我的代码,但它给出了一条错误消息。

我现有的number.MonoReading

<div>
  @Html.LabelFor(m => m.MonoReading)
  @Html.TextBoxFor(m => m.MonoReading, new {@id="InitialMonoReading", @class = "form", @readonly = "readonly" })
  @Html.ValidationMessageFor(m => m.MonoReading)
</div>

这是我将输入新数据的文本框。 MonoReading2(必须大于MonoReading):

<div>
  @Html.LabelFor(m => m.MonoReading2)
  @Html.TextBoxFor(m => m.MonoReading2, new { @id="newMonoReading", @class = "form-add" })
  <div id="MonoErrorMessage"></div>
  @*@Html.ValidationMessageFor(m => m.MonoReading2, new { @id="MonoErrorMessage" })*@
</div>

我已经尝试过了,这就是我目前所做的:

<script type="text/javascript">
  $(document).ready(function () {
    $("#newMonoReading").focus(function () {
      var str = "";

      var initialMonoReading = $('#InitialMonoReading').val();
      var newMonoReading = $('#newMonoReading').val()
      if(newMonoReading < initialMonoReading){
        $('#MonoErrorMessage').text("New Readings must be less than existing");
      }
      else{
        $('#MonoErrorMessage').text("");
      }
    })
      .change();
  });
</script>

这样做的问题是它根本没有效果。它有效,但它非常不整洁。当我点击文本框时,即使我没有输入任何内容,它也会立即出现。它也没有那么快。

还有其他方法可以做到这一点吗?

【问题讨论】:

  • 什么意思“根本没有效果”
  • 它可以工作,但它非常不整洁。当我单击文本框时,即使我没有输入任何内容,它也会立即出现。它也没有那么快
  • 好吧,您可以将事件侦听器更改为.blur(或.change)...老实说,我认为速度不是问题!如果它确实重要,只需缓存您的元素。
  • 同样,当我输入一个较低的值时,错误就会出现,当我输入一个较高的值时,错误仍然存​​在!!它应该是什么而不是模糊
  • .focus 应该是 .blur.change

标签: javascript jquery .net validation input


【解决方案1】:

由于您只在完成编辑值时才真正关心,因此您可以使用 jQuery focusout 事件。这往往比标准的blur 事件更可靠。如果过于频繁地在change 上进行验证,可能会让用户感到恼火:

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ddc1jgp2/5/

$(function () {
    $("#newMonoReading").on('focusout', function () {
        var str = "";

        var initialMonoReading = $('#InitialMonoReading').val();
        var newMonoReading = $('#newMonoReading').val()
        if (~~newMonoReading < ~~initialMonoReading) {
            $('#MonoErrorMessage').text("New Readings must be less than existing");
            $('#MonoErrorMessage').show();
        } else {
            $('#MonoErrorMessage').hide();
        }
    });
});

您实际上可能希望在 任一输入更改时进行检查,并且 focusout 支持父元素,因此如果您希望 任一输入更改验证,请尝试此操作:

JSFiddle: http://jsfiddle.net/TrueBlueAussie/ddc1jgp2/6/

$(function () {
    $("#parent").on('focusout', function () {
        var str = "";
        var initialMonoReading = $('#InitialMonoReading').val();
        var newMonoReading = $('#newMonoReading').val()
        if (~~newMonoReading < ~~initialMonoReading) {
            $('#MonoErrorMessage').text("New Readings must be less than existing");
            $('#MonoErrorMessage').show();
        } else {
            $('#MonoErrorMessage').hide();
        }
    });
});

注意事项:

  • 您正在比较排序规则“a”
  • ~~ 是将字符串更快地转换为整数的快捷方式。如果您愿意,也可以使用parseInt()(指定基数为 10)。
  • 我必须根据对生成元素的最佳猜测来模拟 HTML。
  • 第一个示例可以只使用$(this).val() 而不是$('#newMonoReading').val(),因为那是当前的this 元素。
  • 忽略任何关于不使用 DOM 就绪处理程序的 cmets,因为这将产生零差异,是一种很好的做法。

【讨论】:

  • 感谢您提供的信息。但是,您的第一个 jsfiddle 链接不起作用。当我输入 1000 进行初始阅读时,我在搞乱并输入 200000 进行新阅读,但我仍然在你的 jsfliddle 上收到错误消息。它不会更新并隐藏错误.... arragghh
  • 您实际上是在与&lt; 进行字符串比较 :) 我会调整代码。
  • stackoverflow.com/questions/26970867/… 关于这个伙伴的任何想法
【解决方案2】:

不要使用 onFocus 事件。当页面加载时,它会立即触发。您应该改为使用 onChange 事件,以便仅在用户键入时触发它...

<script type="text/javascript">
    $("#newMonoReading").change(function () {
        var str = "";

        var initialMonoReading = $('#InitialMonoReading').val();
        var newMonoReading = $('#newMonoReading').val()
        if(newMonoReading < initialMonoReading)
        {
            $('#MonoErrorMessage').text("New Readings must be less than existing");
            $('#MonoErrorMessage').show();
        }
        else
        {
            $('#MonoErrorMessage').hide();
        }
    });
</script>

【讨论】:

  • on .change 它在我加载页面时出现。这就是我最初使用 .focus 的原因。
  • 该函数之外的任何地方
  • 还要确保在页面加载时不要触发onChange事件。
  • 对不起,我不明白,你说我不应该使用 .focus 而是使用 .change,但你说不要把它放在 doucument.ready 中
  • 你去试试吧。
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多