JQuery.validate - 在模糊一个规则而已; 剩下的应该是正常的吗? JQuery

2019-05-12 09:46发布

我工作在一个小提琴表明我想为我的用户ID字段做简单的验证:

  1. 让它要求(尽最大可能地验证)
  2. 设定的最小长度(验证尽最大可能地)
  3. 设置最大长度(验证尽最大可能地)
  4. 运行一个AJAX调用,以确保用户ID不存在( 我想只运行此上模糊

我不使用的validate() - 远程规则,因为我想有一个自定义对象返回只是一个简单的字符串,而不是。 如果可能的话用远程它只是呼吁模糊的规则,然后我可以尝试为。 (我所有的AJAX响应遵守一套对象定义。)

HTML

<form action="#" method="get" id="register-wizard">User ID:
    <br />
    <input type="text" class="form-control required confirm-me" id="User_UserId" name="User.UserId" autocomplete="off" />
    <div class="loader user-id hide" style="display: none;"><i class="icon-spinner icon-spin icon-large"></i> (Checking...)</div>
    <p>
        <button id="next">Next</button>
    </p>
</form>

JavaScript的

var $wizardForm = $("#register-wizard");
var $validator = $wizardForm.validate({
    rules: {
        "User.UserId": {
            required: true,
            minlength: 3,
            maxlength: 125,
            userIdCheck: true
        }
    }
});

$("#next").click(function (e) {
    e.preventDefault();    
    //do validations before moving onto the next tab in the wizard
    var $valid = $wizardForm.valid();
    if (!$valid) {
        $validator.focusInvalid();
        return false;
    }
});    
jQuery.validator.addMethod("userIdCheck", function (value, element) {
    var validator = this;
    this.startRequest(element);    
    var $loader = $(".loader.user-id");    
    $.ajax({
        url: "/echo/json/",
        type: "POST",
        data:{
            json: JSON.stringify({
                text: 'some text'
            }),
            delay: 1
        },
        success: function (result) {
            console.log("result: ")
            console.log(result);

            validator.stopRequest(element, true);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert("A server error occurred.\n\n" + textStatus);
        },
        beforeSend: function () {
            $loader.show();
        },
        complete: function () {
            $loader.hide();
        }
    });

return "pending";
}, "The user ID is already in use");

这里是我的小提琴: http://jsfiddle.net/eHu35/3/

Answer 1:

报价标题 :“在模糊一个规则只,其余的应该是正常的吗?”

不,各种触发事件,如onfocusoutonkeyup ,等等,都引发了“每场”的基础上。 你不能有一个字段一个规则,比如min ,引发正常的所有事件,而对于同场其他规则,比如说remote ,仅由触发onfocusout 。 ( 你可以,但是,对于不同的领域有不同的事件 )。

在大多数关于这一主题的SO线程我见过的,用户将禁用onkeyup为了防止恒定过早触发remote规则。 当测试一个重新验证码的代码,例如,禁用onkeyup作为一个新的代码每次生成一个出现故障是必需的。



Answer 2:

我遇到同样的问题,并以此方式工作,不使用远程方法:

$.validator.addMethod("userIdCheck", function(value, element, params) {
    if (event.type == "blur" || event.type == "focusout") {
        var result;
        $.ajax({url: "path", async: false,
                success: function(data){
                  result = data;
              }})
        return result;
    } else {
        return true;
    }       
}, "The user ID is already in use");

但是,这并不在Firefox上运行,事件不确定的。 所以我modefied的源代码(任何人有另一种方式?):

function delegate( event ) {
    var validator = $.data( this[ 0 ].form, "validator" ),
        eventType = "on" + event.type.replace( /^validate/, "" ),
        settings = validator.settings;
        // add event to validator
        validator.event = event;
        if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
            settings[ eventType ].call( validator, this[ 0 ], event );
        }
    }

那么我们就可以这样使用:

$.validator.addMethod("userIdCheck", function(value, element, params) {
    var eventType = this.event.type;
    if (eventType == "blur" || eventType == "focusout") {
        var result;
        $.ajax({url: "path", async: false,
                success: function(data){
                  result = data;
              }})
        return result;
    } else {
        return true;
    }
}, "The user ID is already in use");

不太守就够了,但是这是我找到解决这个问题的唯一途径。



文章来源: JQuery.validate - one rule on blur only; the rest should be normal?