Проверка jQuery: обратный вызов, вызванный определенным правилом? - PullRequest
5 голосов
/ 08 октября 2010

Я пытаюсь сделать следующее: У меня есть форма, которая проверяется с помощью плагина проверки jQuery. Есть поле, в котором есть пара правил:

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

Теперь, когда одно из правил нарушено, точнее, удаленное правило, я хочу вызвать дополнительный код. Итак, если удаленное правило возвращает ошибку, и рядом с полем emailForRequest появляется метка ошибки, мне нужен обратный вызов, который выполняет некоторые другие действия в фоновом режиме.

Короче говоря: могу ли я узнать, какое правило вызывает ошибку, увидеть его с точки зрения кода и добавить к нему выполнение дополнительной функции?


EDIT Хорошо, благодаря ответу Лиама и лучшему прочтению руководства, я пришел к этому:

        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 разных результата, один из которых имеет значение true, а два других зависят от языка. Поэтому я хотел бы отправить объект json в качестве ответа с переменной var для типа ошибки (одинаковой для всех языков) и переменной var с сообщением (переведено). Итак, в моей полной функции я могу затем проверить тип ошибки и ответить в соответствии с этим. Достаточно просто, за исключением того, что это испортит стандартную ошибку проверки, которая должна появиться рядом с моим полем, и я пока не нашел решения для этого.

Ответы [ 5 ]

7 голосов
/ 26 сентября 2012

Не уверен, что этот поток все еще открыт, но мне удалось решить эту проблему с помощью вызова 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'];
    }
);
1 голос
/ 08 октября 2010

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 
    }
},
...

Надеюсь, это поможет.

1 голос
/ 08 октября 2010

Теперь у меня было время, чтобы пройти руководство, попробуйте это

0 голосов
/ 13 августа 2013
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 и проверьте здесь на основе "." доступ к собственности.

0 голосов
/ 11 октября 2010

Благодаря FreekOne и его идее префикса я пришел к работоспособному решению.Я говорю «выполнимо», потому что не очень доволен его чистотой.Поскольку я точно не знаю, что происходит, когда в валидаторе и возни с функцией dataFilter и успешностью вызова ajax нарушается нормальная работа валидатора, я пришел к следующему решению со «скрытым» префиксом:

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 для распознавания сообщения об ошибке кажется мне немного грубым,Итак, если кто-нибудь знает лучшее решение, пожалуйста, дайте мне знать.

...