8

我目前正在使用bassistance jquery 验证或 jqueryvalidation 插件(他们将其重命名),我让它验证如下形式:

if($.fn.validate) {
        $("#frmNewOrder").validate({
            rules: {
                txtAmount: {
                    required: true,
                    digits: true
                },
                ddlAccount: {
                    required: true
                },
                ddlBank: {
                    required: true
                }
            }
        });
    }

现在取决于我需要或不需要额外字段的下拉列表,并取决于该下拉列表的另一个文本输入。所以就像:

 if($('#txtAmount').val() >= 10000){
     //add ddlReason required
 }

 if($('#ddlReason').val() == 'o'){
     //add txtReason required
 }

我已经尝试像其他字段一样添加 css 类“必需”,但如果它们不在规则之内,我会接受它,那么它不起作用?我试过添加这样的规则:

 $( "#ddlReason" ).rules( "add", {
        required: true});

这也不起作用。有什么建议么?

编辑:这是我正在使用的 jquery 验证的链接。如果我在外面使用规则,则会出现此错误:

Uncaught TypeError: Cannot read property 'settings' of undefined 

在第 124 行:

var settings = $.data(element.form, 'validator').settings;

并使用我在其他地方看到的建议,我已经这样做了,这就是导致错误的原因:

var defaultrules = {
    txtAmount: {
        required: true,
        digits: true
    }
}

if($.fn.validate) {
    $("#frmNewOrder").validate();
    addRules(defaultrules);
}

编辑 2:这是 html 标记,希望对您有所帮助。

<form id="frmNewOrder" name="frmNewOrder" action="" method="post">
<label>Amount</label>
<input type="text" name="txtAmount" id="txtAmount" class="required" />
<button id="calculate" type="button">Calculate</button>
<div id="dvreason" style="display:none;">
    <select id="ddlReason" name="ddlReason">
         <option></option>
         <option value="i">Option 1</option>
         <option value="o">Other</option>
    </select>
    <div id="dvother" style="display:none">
       <label>Other reason</label>
       <input type="text" name="txtOther" id="txtOther" />
    </div>
</div>
<input type="submit" name="send" id="send" value="Send" />
</form>
4

3 回答 3

10

我也收到了同样的错误消息,并意识到我应该validate()先在表单上调用,然后再调用rules()各个输入字段。此行为已记录在案

$('#form').validate({
  rules: {
    email: {
      email: true
    }
  }
});

$('#email').rules('add', {
  required: true
});

这可能不是 OP 问题的答案,但我发布此内容是为了帮助任何搜索jquery validation Cannot read property settings of undefined并单击此页面的人。

感谢@nsawaya的提示!

于 2014-10-03T06:01:26.233 回答
5

面临类似的问题,

实际上,您会注意到在第 124 行未定义验证器,即没有与表单关联的验证器实例

如果您检查 validate 方法,您会看到如果未定义验证器,它将创建一个新的

var validator = $.data(this[0], 'validator');
        if ( validator ) {
            return validator;
        }

        // Add novalidate tag if HTML5.
        this.attr('novalidate', 'novalidate');

            //HERE it is creating a new one using the constructor   
        validator = new $.validator( options, this[0] );
        $.data(this[0], 'validator', validator);

显然,该rules方法假定验证器已经存在于表单对象中,因此据我了解,并且由于validate返回验证器实例,您可以调用validate并将额外的规则附加到返回的验证器settings.rules对象并再次重新运行,这不是很实用。

另一种解决方案是在调用之前简单地将添加的规则附加到初始规则对象validate

因此,在我的情况下,我希望将输入字段验证为数字,但我不希望 Google Chrome 将其设为数字​​字段(只需尝试在 Chrome 中查看我的意思,这有绕过类型编号验证的问题如果用户手动输入,在我的情况下,用户很可能会手动输入数字)

代码示例:

var customRule = {number: true};

//suppose populateValidateRules() fills your initial rules, which is my case at least
var validationRules =  populateValidateRules();

validationRules["rules"].fieldToBeDynamicallyModifiedForValidation= customRule;

$(formId).validate(validationRules);

希望这可以帮助

于 2013-10-22T21:08:26.240 回答
0

在使用 id 获取动态添加元素时,它们是一个问题,因此如果您使用属性选择器,它就会起作用,例如添加属性data="ddlReason"并使其如下所示:

$( "input[data='ddlReason']" ).rules( "add", {
        required: true
});
于 2014-10-10T07:32:52.737 回答