为什么我的 jQuery 检查必填输入字段的脚本这么慢?

Why is my jQuery script for checking required input fields so slow?

我正在尝试使用 jQuery 为无法识别 required HTML 标记的浏览器检查必填字段。我的 jQuery 脚本如下。

$('div').on('submit', '#myform', function(e){     
    e.stopPropagation();
    e.preventDefault();
    $( ':input[required]').each( function (e) { 
        if ( this.value.trim() == '' ) {
            $('.error').html(this.name + " is required");
            return false;
        }       
    }); 
    $(this).unbind().submit();
 }); 

但是加载速度很慢!单击表单的提交按钮后,大约需要 5 秒钟才能显示错误消息!它似乎正在循环。为什么会这样?我该如何解决?

当您在最后一行调用 submit() 时,您创建了无限循环。

委托的 submit 处理程序未直接绑定到表单元素,因此您无法以这种方式解除绑定处理程序。您正在创建一个无限循环。您应该使用 off 方法并取消绑定 div 元素的处理程序。

另请注意,each 回调的返回值不会影响 运行 包装器、提交处理程序的流程。每个函数都有自己的返回值。

$('div').on('submit', '#myform', function(e){     
    var $e = $('.error').empty();
    var $invalids = $(':input[required]').filter( function (e) { 
        var invalid = this.value.trim().length === 0;
        if ( invalid ) {
            $e.append('<p>' + this.name + " is required</p>");
        }
        return invalid;       
    }); 
    if ( $invalids.length ) {
       return false;
    }
    this.submit();
}); 

HTMLFormElement 对象的 submit 方法不会触发 jQuery 提交处理程序,因此无需解除绑定处理程序。如果验证通过则表单正常提交。

性能方面你也可以避免使用 :input 选择器。来自 jQuery :input documentation:

Because :input is a jQuery extension and not part of the CSS specification, queries using :input cannot take advantage of the performance boost provided by the native DOM querySelectorAll() method. To achieve the best performance when using :input to select elements, first select the elements using a pure CSS selector, then use .filter(":input").

HTML5 浏览器中的 elements property of the HTMLFormElement object returns a HTMLFormControlsCollection 对象和 HTML4 浏览器中的 HTMLCollection 对象包含表单元素的所有控件。您也可以使用此 属性 而不是查询 DOM 并使用 jQuery filter 方法过滤 required 字段:

 $(this.elements).filter('[required]');