jQuery Validate:如何验证非表单元素?

nee*_*zer 10 jquery jquery-validate

我有一张附有地图的表格.单击地图会向表单中的div添加隐藏的输入.

我想要一个验证规则来检查该div是否有任何隐藏元素.到目前为止,我只能使用虚拟元素执行此操作,我必须在发布表单之前手动删除:

<form action="..." method="post" id="signup">
  <!-- ... -->
  <div id="zones_selected"><input type="hidden" name="dummy"></div>
  <!-- ... -->
</form>

$.validator.methods.zones = function (value, element, param) { return ($zone_holder.find('input[name!=dummy]').length > 0); };
$('#signup').validate({
  rules: {
    //...
    'dummy': 'zones'
  },
  //...
  submitHandler: function(form) { $(form).find('input[name=dummy]').remove(); form.submit(); }
});
Run Code Online (Sandbox Code Playgroud)

但是,由于我的自定义验证器方法似乎没有触发该unhighlight函数,因此这些因为错误放置而有很多不足之处,而且我只是为了进行表单验证而输入一个输入(不是非常不引人注目).

我想要的是没有额外submitHandler的规则来检查div中是否存在隐藏输入会产生unhighlight触发器(如果用户点击地图 - 这会创建一个新的隐藏输入 - 我显示的消息告诉他们这样做会消失).

实现这一目标的最佳方法是什么?

Chr*_*sma 2

我过去曾尝试这样做。我不相信有一种方法可以在不对 jquery.validator 代码库进行一些修改的情况下做到这一点。

当查看 JQuery.Validator.js 时,检查 ln 423 上的“elements”函数,您会看到类似这样的内容

return $([]).add(this.currentForm.elements)
            .filter(":input")
            .not(":submit, :reset, :image, [disabled]")
            .not( this.settings.ignore )
            .filter(function() {
                !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);

                // select only the first element for each name, and only those with rules specified
                if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
                    return false;

                rulesCache[this.name] = true;
                return true;
            });
Run Code Online (Sandbox Code Playgroud)

过滤器(“:input”)会给你带来悲伤。