javascript - JQuery Validate 在 Chrome 中同时触发突出显示和取消突出显示

标签 javascript jquery google-chrome jquery-validate

我在使用 Jquery 验证时遇到了一个非常奇怪的问题,该问题仅发生在 Chrome 中。此页面上的验证似乎同时触发了 .validate() 函数中的突出显示和取消突出显示函数,因此如果我不填写表单,它会循环遍历每个元素并在突出显示函数中应用“无效”类,但随后对于由于某种原因它会经历并立即应用取消突出显示的代码,我不知道为什么?

JS

$(document).ready(function () {
    //Validation for form fields on Payment form

    /*This adds a method to test whether value is equal to placeholder, and if it is, don't consider it filled out.  This is necessary to circumvent IE placeholder plugin*/
    jQuery.validator.addMethod("notEqual", function (value, element, param) {
        return this.optional(element) || value != param;
    }, "Required.");

    $('#payment-form').validate({
        onfocusout: function (element) {
            $(element).valid();
        },
        rules: {
            "data[Payment][card_holder]": { required: true, minlength: 2 },
            "data[Payment][card_number]": { required: true, creditcard: true },
            "data[User][first_name]": { required: true, notEqual: "First Name" },
            "data[User][last_name]": { required: true, notEqual: "Last Name" },
            "data[UserDetail][company]": { required: true },
            "data[UserDetail][job_title]": { required: true },
            "data[UserDetail][telephone]": { required: true },
            "data[User][email]": {
                required: true,
                email: true,
                remote: {
                    url: "/usermgmt/users/email_exists",
                    type: "post"
                }
            },
            "data[User][password]": { required: true },
            "data[Address][billing_line_1]": { required: true },
            "data[Address][billing_line_2]": { required: true },
            "data[Address][billing_state]": { required: true },
            "data[Address][billing_postcode]": { required: true },
            credit_exp_month: { required: true, notEqual: "MM", number: true, max: 12, minlength: 2, maxlength: 2 },
            credit_exp_year: { required: true, notEqual: "YYYY", number: true, minlength: 2, maxlength: 4 },
            "data[Payment][cvv]": { required: true, number: true, minlength: 3, maxlength: 4 },
        },
        errorClass: 'error',
        unhighlight: function (element, errorClass, validClass) {
            $(element).removeClass(errorClass).addClass(validClass);
            validateIcon(element);
        },
        highlight: function (element, errorClass, validClass) {
            $(element).addClass(errorClass).removeClass(validClass);
            validateIcon(element);
        }
    });

    function validateIcon(element) {
        $(element).siblings('span.validate_icon').remove();
        if ($(element).hasClass('error')) {
            alert("error");
            $(element).closest('li').find('label>span:first').html('<span class="validate_icon invalid"> <span class="icon-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-exclamation"></i></span></span>');
        } else if ($(element).hasClass('valid')) {
            alert("valid");
            $(element).closest('li').find('label>span:first').html('<span class="validate_icon valid"> <span class="icon-stack"><i class="icon-sign-blank icon-stack-base"></i><i class="icon-ok"></i></span></span>');
        }
    }
});

存在处理电子邮件的 PHP 代码:

public function email_exists() {
    $this->autoRender = false;
    if($this->request->is('post')) {
        $this->RequestHandler->respondAs('json');
        if(!$this->User->findByEmail($this->request->data['User']['email'])) {
            echo json_encode(true);
        } else {
            echo json_encode(false);
        }
    }
}

我也尝试过简单地回显“true”;和回显1;我已经尝试了下面评论中建议的所有内容,但无论如何 - 问题仍然存在。

最佳答案

我遇到了完全相同的问题,通过查看您的代码,我可能会说您有相同的原因,但让我们将其分解。

检查

首先,让我们检查一下我的评论是否相关,并且我确实可以为您提供帮助。在您的电子邮件验证设置中注释远程参数:

"data[User][email]": {
            required: true,
            email: true
        },

你的问题解决了吗?太好了,请继续阅读(请随意跳至修复部分)。

问题

1。当插件验证时,它会创建一个错误列表,存储到名为“errorList”的数组中。

2。您用过showErrors吗?功能?它可以显示所有错误,也可以定位显示错误。如果您想显示特定错误,或者显示超出插件限制的错误(例如:60 秒超时已过期),您可以使用该方法。

3。当显示特定错误时,该方法的作用是将指定的错误添加到 errorList 中。

4.问题是在添加新错误之前该列表已被清除(我没有编写代码,但似乎这样做是为了保持该列表干净整洁,并且同一输入不会出现两个不同的错误)。

5。现在,当远程检查电子邮件时,我们处于同样的超时情况。因此它使用 showErrors 功能,这意味着单击时会验证表单,几秒钟后(使用 PHP 响应),会显示电子邮件错误,但会清除错误列表。这就是正在发生的事情。

修复

  1. 如果您不打算显式使用 showErrors,事实是您可以注释清除 errorList 的行:

    showErrors: function( errors ) {
        if ( errors ) {
            // add items to error list and map
            $.extend( this.errorMap, errors );
            //this.errorList = [];
            for ( var name in errors ) {
            ...
    
  2. 如果您打算显式使用该方法,则可以尝试此版本。不清除错误列表,但检查您是否没有两次添加相同的错误:

    showErrors: function( errors ) {
        if ( errors ) {
            // add items to error list and map
            $.extend( this.errorMap, errors );
            for ( var name in errors ) {
                var tempElem = this.findByName(name)[0];
                this.errorList = jQuery.grep(this.errorList, function( error, i ) {
                    return error.element != tempElem;
                });
                this.errorList.push({
                    message: errors[name],
                    element: tempElem
                });
            }
    

如果有效或者您有任何问题,请告诉我。

关于javascript - JQuery Validate 在 Chrome 中同时触发突出显示和取消突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22903707/

相关文章:

javascript - 将文本传递到Twitter Web Intent时的未定义值

html - Jquery 函数将页面上的所有单选按钮切换为

javascript - 移动 Chrome 上的 IFrame 播放器 API

google-chrome - Chrome 卡在带有许多隐藏单选按钮的页面上

javascript - Django 管理模板中的多个版本的 jQuery

javascript - 为什么 if(number <=10) 不起作用?

javascript - append 函数将以前的数据附加到新数据

javascript - 谷歌地图 - 未捕获 InvalidValueError : initialise is not a function

javascript - chrome.storage.sync.get 不返回值 - Angular 服务

javascript - jquery 或 javaScript 中的值设置函数?