【问题标题】:jQuery validation: a callback triggered by a certain rule?jQuery验证:由某个规则触发的回调?
【发布时间】:2010-10-08 15:06:02
【问题描述】:

我正在尝试执行以下操作: 我有一个通过 jQuery Validation Plugin 验证的表单。有一个字段有几个规则:

            var validator = $("#myForm").validate({ 
                rules: {
                    emailForRequest: { 
                        required: true, 
                        email: true,
                        remote: "'emailcheck.php"
                    } 
                } ,
...

现在,当其中一条规则被破坏时,更准确地说是远程规则,我想触发一些额外的代码。所以,如果远程规则返回一个错误并且它的错误标签出现在 emailForRequest 字段旁边,我需要一个在后台执行其他操作的回调。

简而言之:我可以查看哪个规则触发了错误,我的意思是按代码查看,然后附加一个额外函数的执行吗?


编辑 好的,多亏了 Liam 的回答和更好地阅读了我的手册:

        rules: {
            emailForRequest: { 
                required: true, 
                email: true,
                remote: {
                    url: "'emailcheck.php" ,
                    type: "post" ,
                    complete: function(data){
                        if( data.responseText != "true" ) {
                            alert("Sorry mate, this email address was registered but never activated!");
                        }
                    }
                }
            } 
        } , ...

但还有一个问题。 emailcheck.php 脚本可以返回 3 个不同的结果,其中一个为真,另外两个与语言有关。因此,我想发送一个 json 对象作为响应,其中包含错误类型的 var(在所有语言中都相同)和带有消息的 var(已翻译)。因此,在我的完整功能中,我可以检查错误类型并据此做出响应。很简单,只是它会搞砸应该出现在我的字段旁边的验证标准错误,而我还没有找到解决方案。

【问题讨论】:

  • 我也希望看到解决方案!
  • 你能告诉我们你在哪里找到了高级说明,详细说明了 emailForRequest 选项等
  • 嘿 Liam,当然,你让我走上了正确的道路!这是我找到说明的 URL:docs.jquery.com/Plugins/Validation
  • 我的代码目前是:rules: { emailForRequest: { required: true, email: true, remote: { url: "emailcheck.php" , type: "post" , complete: function(data) {警报(数据);返回数据; } } } } ,... 但我有冲突让标准错误消息仍然出现。
  • 你的 remote: {} 对象也应该有一个 error: function() 和一个 success: function() 能力,如果你可以去的话: error: function(code, message) { //work with message} 或 $.each(message) ... 仍然无法在手册中找到所有这些,是在特定的示例中吗?

标签: jquery validation jquery-plugins jquery-validate


【解决方案1】:

不确定此线程是否仍处于打开状态,但我能够通过调用 addMethod 并使用数组来跟踪该表单元素的错误消息来解决此问题。

这里是代码

//phone
var phoneStatus = null;
$.validator
.addMethod(
    'validatePhone',
    function()
    {
        $.ajax({
            url: /path/to/script,
            async: false,
            dataType: 'json',
            data:{ formDataHere},
            success: function(data)
            {
                errorMessages['validatePhone'] = data.message;
                phoneStatus = data.status;
            },
            complete: function(){},
            error: function(){}
        });
        return phoneStatus;
    },
    function()
    {
        return errorMessages['validatePhone'];
    }
);

【讨论】:

  • 这不会立即返回phoneStatus 的值从而破坏验证吗?
  • 关键行是async:false。这将等到调用完成,然后处理回调函数,然后执行return phoneStatus;语句。
【解决方案2】:

jquery.validate.js - 第 941 行:

success: function(response) {
    validator.settings.messages[element.name].remote = previous.originalMessage;
    var valid = response === true;
    if ( valid ) {
    ....

我认为你可以很容易地在这里插入你自己的函数。您有可用的响应和元素名称,因此定位具有特定名称的元素将相当容易。如果您不想修改脚本本身(即从 CDN 服务器加载),您可以根据原始规则编写自己的远程验证规则。

除此之外,AFAIK,没有内置函数/方法可以返回未验证的规则名称。

更新

找到规则和触发它的元素的解决方法是在 errorPlacement 函数中处理它:

...
},
errorPlacement: function(error, element) {
    error.insertBefore(element); // default positioning

    if ((error == 'your error message') && (element.attr('id') == 'your_targets_id')) {
        // your function 
    }
},
...

希望这会有所帮助。

【讨论】:

  • 嗨 FreekOne,感谢您的意见。我非常接近基于利亚姆早期(并且消失了?)答案的解决方案,并且接近您的建议,但在不同的位置。检查我原来的问题的编辑。
  • 请看我更新的答案。您基本上可以通过错误消息识别规则,并通过其 ID 识别元素。我还没有测试过,但它应该可以工作。
  • 干杯伙伴!但是我这里有个问题,我不能使用 error == 'your error message' 因为我不知道错误消息(它取决于语言并且可以由我们的客户更改)。但这是另一个最有趣的轨迹!
  • 你没有让这变得更容易:D 添加一个前缀服务器端怎么样,只是为了这个规则?像'remote_The rest of your error message'然后在errorPlacement函数中你会检查那个前缀?如果找到了,你就会知道是哪个规则触发了它,去掉前缀,输出错误信息,然后运行你的函数。
  • 当然,您必须将实际错误放置行移到自定义检查下方,以便输出不带前缀的错误消息。
【解决方案3】:

现在我有适当的时间来阅读手册,试试这个

var validator = $("#myForm").validate({ 
            rules: 
               {
                emailForRequest: 
                { 
                    required: true, 
                    email: true,
                    remote: "emailcheck.php"
                }
            },
            messages:
            {
              emailForRequest:
               {
                remote: jQuery.format("{0}")
               }
            }

       });

【讨论】:

  • 奇怪,您的回答消失了几秒钟,现在我可以再次访问它。查看我原来的问题的编辑,看看我到目前为止有什么。
  • 我已经编辑了我的答案,应该可以解决问题。如果您从您的 php 返回 true 或 false,它将显示默认消息,但如果您返回一个字符串,它将显示该字符串。
  • 嘿 Liam,返回错误字符串从来都不是问题,这是验证器的默认行为。问题是,在过程中的某个地方,我需要在代码方面识别出哪个错误,而不依赖于字符串,因为字符串本身是每种语言的变量。不管怎样,谢谢你和我一起思考。我找到了一个解决方案,我会在一分钟内给出答案。
【解决方案4】:

感谢 FreekOne 和他对前缀的想法,我找到了一个可行的解决方案。我确实说可行,因为我对它的清洁度不太满意。由于我不确切知道验证器中发生了什么,并且修补 ajax 调用的 dataFilter 和成功功能会破坏验证器的正常工作,因此我找到了以下带有“隐藏”前缀的解决方案:

var validator = $("#myForm").validate({ 
                rules: {
                    emailForRequest: { 
                        required: true, 
                        email: true,
                        remote: {
                            url: "emailcheck.php" ,
                            type: "post" ,
                            complete: function(data){
                                if( data.responseText != true ) {
                                    if( data.responseText.search(/validationErrorTag/) > 0 &&
                                        data.responseText.search(/inactive/) > 0 ) {
                                         inactiveFunctionality();
                                    }
                                }
                            }
                        }
                    } 
                } ,...

虽然 emailcheck.php 返回一个 json 编码的 true 如果一切都签出或 json 编码的错误消息,如

<span class="validationErrorTag">inactive</span>This address is not yet activated.

最后,我在我的 css 文件中有一个条目,以确保前缀不显示:

.validationErrorTag {
    display: none;
}

就像我说的,它可以工作,我现在打算使用它,但是使用隐藏的 html 前缀来识别错误消息对我来说似乎有点粗略。所以,如果有人知道更好的解决方案,请告诉我。

【讨论】:

    【解决方案5】:
    var validator = $("#myForm").validate({ 
        rules: {
             emailForRequest: { 
                    required: true, 
                    email: true,
                    remote: {
                        url: "emailcheck.php" ,
                        type: "post" ,
                        complete: function(data){
                            if( data.responseText != true ) {
                                var type = data.responseText.split('|');
                                if(type[0]=='inactive') {
                                             inactiveFunctionality();
    // type[1] contains your message, display it using any method! e.g. $('#id').html(type[1]); or sooo!
                                        }
                                    }
                                }
                            }
                        } 
                    }
    

    * 或 **

    你可以使用 json !只需以 json 格式发送响应文本并根据“。”在此处检查。属性访问。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多