Ненавязчивый пользовательский адаптер и метод jQuery в jsFiddle

Я не могу заставить этот jsFiddle работать, но он работает в браузере: http://jsfiddle.net/vtortola/jYq2X/< /а>

Я пытаюсь добавить новое пользовательское правило для сравнения двух полей. Кастомный адаптер работает, вызывается и настраивает параметры. Но пользовательский метод никогда не вызывается.

Я выполняю этот JS на готовой DOM:

$.validator.addMethod("customequal-method", function (val, el, p) {
    var $other = $(el).closest('form').find('input[name=' + p.other + ']'); 
    return $other.length && $other.val() == val;
});

$.validator.unobtrusive.adapters.add("customequal", ["other"],
                                     function (options) {
                                         options.rules["customequal-method"] = options.params;
                                         options.messages["customequal-method"] = options.message;
                                     });



$(function(){
    $.validator.unobtrusive.parse($('#myform'));
    $('[type=button]').click(function(e){e.preventDefault(); $('form').valid();});

    $('input[type=text]').blur();
})

Это поля в HTML:

    <input type="text" name="StartDate2" id="StartDate2" value="2"
           data-val="true" data-val-customequal="xx xxx" data-val-customequal-other="EndDate2"/>   
    <input type="text" name="EndDate2" id="EndDate2" value="3"
           data-val="true" data-val-customequal="xx xx" data-val-customequal-other="StartDate2"/> 

Я пробовал разные вещи, но ничего не работает.

Есть идеи?


person vtortola    schedule 23.07.2013    source источник
comment
Вопрос не в jsfiddle. Удален тег jsfiddle.   -  person Sparky    schedule 30.07.2013
comment
@Sparky, значит, ссылка на пример JsFiddle не имеет отношения к отладке?   -  person TheOptimusPrimus    schedule 30.07.2013
comment
@TheOptimusPrimus, по той же причине каждый вопрос SO, содержащий скрипку, не помечен тегом jsfiddle.   -  person Sparky    schedule 31.07.2013
comment
Тогда похоже, что предстоит проделать большую работу по модерации: stackoverflow.com/questions/tagged/jsfiddle   -  person TheOptimusPrimus    schedule 31.07.2013
comment
@Sparky Боюсь, вопрос в jsFiddle. Этот код работает в браузере, но не в jsFiddle. И это была вся причина этого поста.   -  person vtortola    schedule 31.07.2013
comment
@vtortola, тогда я предлагаю вам обновить свой OP, поскольку вы никогда не упоминали, что он отлично работает в вашем браузере. И если это работает в браузере, какая разница, что это не работает в jsFiddle?   -  person Sparky    schedule 31.07.2013
comment
Как говорится в ответе в первом решении, потому что я не использовал правильный вариант для инициализации этого JS.   -  person vtortola    schedule 31.07.2013


Ответы (1)


Ваша скрипка не работает, потому что:

  • весь ваш код работает в готовой DOM, поэтому вы добавляете свой собственный unobtrusive.adapters.add после плагина unobtrusive.validator с именем unobtrusive.parse(document), который регистрирует все входные данные без вашего собственного валидатора.

  • если вы вызываете .validate() несколько раз, он регистрирует правила только в первый раз и не переопределяет их при последующих вызовах. Таким образом, хотя вы снова вызвали unobtrusive.parse в DOM, загруженном на этот раз с добавленным пользовательским адаптером, это все равно не будет иметь никакого эффекта.

Итак, у вас есть два способа исправить это:

Зарегистрируйте свои пользовательские адаптеры до события загрузки DOM, вы можете сделать это, изменив свою скрипку для использования

"No wrap - in <head>"

Демонстрация JSFiddle.

Or

Удалите уже добавленный объект валидатора с помощью $('#myform').data('validator', null) перед вызовом unobtrusive.parse вручную:

$(function () {
    $('#myform').data('validator', null);

    $.validator.unobtrusive.parse($('#myform'));
    $('[type=button]').click(function (e) {
        e.preventDefault();
        $('form').valid();
    });

    $('input[type=text]').blur();
})

Демонстрация JSFiddle.

person nemesv    schedule 30.07.2013