我怎样才能让 typeahead.js 和 jquery.validate 一起玩?

How can I get typeahead.js to play nicely with jquery.validate?

我有一个使用 jQuery 验证的 ASP.NET MVC 5 网站(MVC 项目模板中的 jquery.validate.js)。我正在尝试使用 typeahead.js 在表单中的一个输入字段上实现提前输入功能。 (该表单恰好位于 bootstrap 模态框内)。

因为提交表单会发出一个AJAX请求,所以表单提交事件被捕获如下:

$form.on("submit", function (e) {

    if (!$form.valid()) {
        return false;
    }

    ... do stuff ...

请注意,这里发生的第一件事是检查表单是否存在任何验证错误,由 jQuery 验证库检测到。

如果我使用typeahead,那么一切都很好。我可以在我的表单中输入值并提交,一切都很好。

但是,一旦我执行以下操作为我的输入添加提前输入功能:

$("#myInput").typeahead({
    minLength: 1,
    highlight: true
},
{
    source: mySource
});

...那我就不能再提交表格了。我的表格被认为是有效:$form.valid() returns false.

我认为 typeahead.js 库正在向表单添加一些额外的元素(包括隐藏的输入),这让 jquery.validate.js 库感到困惑。

使用Chrome F12,似乎那里有一个看起来像原始输入副本的输入,遗憾的是该副本似乎已被复制,因此它也有所有 jQuery-验证属性。

我该如何解决这个问题?

似乎额外的输入上有 tt-hint class,因此您可以设置验证以忽略带有 class 的输入。

$form.validate({
    ignore: ':hidden, .tt-hint'
});

这似乎可行(在调用 typeahead() 之后立即放置:

$("input.tt-hint").removeAttr("data-val data-val-required data-val-maxlength data-val-maxlength-max");