jQuery不显眼的验证没有触发动态内容加载

时间:2015-02-05 16:26:22

标签: javascript jquery ajax validation unobtrusive-validation

我正在尝试解析动态插入的表单以添加jQuery不显眼的验证。

我有以下AJAX函数,在用户搜索时执行:

function search(el)
{
    var $this = $(el);
    var $form = $this.closest("form");
    var url = $form.attr("action");
    $results = $("#pnlSearchResults");

    $.ajax({
        type: "POST",
        url: url,
        data: $form.serialize()
    })
    .done(function(data){
        $results.html('');
        $results.html(data);

        var $editForm = $results.find("form.edit-form");
        $editForm.removeData("validator");
        $editForm.removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse($editForm);
    });
}

这会将返回实体的可编辑表单插入页面上的<div>,如下所示。我有两个必填字段,但是当我从这些字段中删除值时,“必需”验证不会触发。它似乎只发生在:

  1. 我删除了这些值。
  2. 将光标远离现场。
  3. 输入新值。
  4. 将光标移开。
  5. 然后删除新值。
  6. 如何解决这个问题,以便在我第一次删除值时进行验证?

1 个答案:

答案 0 :(得分:0)

我找到this question,这导致我在this page上找到答案。

(function ($) {
  $.validator.unobtrusive.parseDynamicContent = function (selector) {
    //use the normal unobstrusive.parse method
    $.validator.unobtrusive.parse(selector);

    //get the relevant form
    var form = $(selector).first().closest('form');

    //get the collections of unobstrusive validators, and jquery validators
    //and compare the two
    var unobtrusiveValidation = form.data('unobtrusiveValidation');
    var validator = form.validate();

    $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
      if (validator.settings.rules[elname] == undefined) {
        var args = {};
        $.extend(args, elrules);
        args.messages = unobtrusiveValidation.options.messages[elname];
        //edit:use quoted strings for the name selector
        $("[name='" + elname + "']").rules("add", args);
      } else {
        $.each(elrules, function (rulename, data) {
          if (validator.settings.rules[elname][rulename] == undefined) {
            var args = {};
            args[rulename] = data;
            args.messages = unobtrusiveValidation.options.messages[elname][rulename];
            //edit:use quoted strings for the name selector
            $("[name='" + elname + "']").rules("add", args);
          }
        });
      }
    });
  }
})($);

用法:

var html = "<input data-val='true' "+
           "data-val-required='This field is required' " +
           "name='inputFieldName' id='inputFieldId' type='text'/>";
$("form").append(html);

$.validator.unobtrusive.parseDynamicContent('form input:last');