2013-05-07 15 views
7

Mam pewne sprawdzanie poprawności po stronie klienta, które sprawdza, czy wartość EndDate jest większa lub równa StartDate. Sprawdzanie poprawności działa, ale nie jest uruchamiane tak, jakbym chciał. Chciałbym wystrzelić tak szybko, jak tylko data zostanie wybrana w datepicker na EndDate. Jak mogę to zrobić? Próbowałem następujące: kodJak wyzwalać sprawdzanie poprawności, które ma wystąpić w datepicker jQuery UI po wybraniu daty?

Datepicker:

$(".datepicker").datepicker({ 
    changeMonth: true, 
    changeYear: true, 
    onClose: function() { 
     $(this).focusout(); 
    } 
}); 

Kod weryfikacyjny:

$("#EndDate").focusout(function() { 
    jQuery.validator.addMethod('datetimegreaterthanorequal', function (value, element, params) { 
     var startDateValue = $(params.element).val(); 

     return Date.parse(value) >= Date.parse(startDateValue); 
    }, ''); 

    jQuery.validator.unobtrusive.adapters.add('datetimegreaterthanorequal', ['startdate'], function (options) { 
     var prefix = options.element.name.substr(0, options.element.name.lastIndexOf('.') + 1), 
      other = options.params.startdate, 
      fullOtherName = appendModelPrefix(other, prefix), 
      element = $(options.form).find(':input[name=' + fullOtherName + ']')[0]; 

     options.rules['datetimegreaterthanorequal'] = { 
      element: element 
     }; 
     if (options.message) { 
      options.messages['datetimegreaterthanorequal'] = options.message; 
     } 
    }); 

    function appendModelPrefix(value, prefix) { 
     if (value.indexOf('*.') === 0) { 
      value = value.replace('*.', prefix); 
     } 
     return value; 
    } 
}) 
+0

Czy wypróbowałeś zdarzenie 'onSelect:'? –

+0

Tak, mam. Coś dziwnego, zauważam, że kiedy umieszczam alert w mojej walidacji, wydaje mi się, że jest dobrze, gdy wybieram datę, ale walidacja już nie działa? Sprawdzanie poprawności działa dobrze, jeśli usunę część 'focusout', ale nie odpali ona, jak tego chcę. –

Odpowiedz

9

Jesteś Przypisywanie weryfikatorów wewnątrz naszego .focusout() imprezy. Usuń ten blok całkowicie, tak jak chcesz, aby były przypisane tylko raz.

Można łatwo wywołać walidacji na opcję jak poniżej onSelect:

$(".datepicker").datepicker({ 
    changeMonth: true, 
    changeYear: true, 
    onSelect: function() { 
     $("#myForm").valid(); 
    } 
}); 
+0

Dzięki Mark! To zadziałało! –

+0

Doskonale działa! –

9

Chociaż odpowiedź od Marka zadziała, należy pamiętać, że będzie sprawdzana poprawność całego formularza. Jeśli chcesz tylko do sprawdzania poprawności pola wprowadzania powiązane, można byłoby lepiej robi:

$(".datepicker").datepicker({ 
    onSelect: function() { 
     $(this).trigger("focus").trigger("blur"); 
    } 
}); 

To udaje się kliknięcie użytkownika wewnątrz pola wejściowego i pozostawiając go ponownie.

+0

Ta opcja działa dobrze, ponieważ $ ("# myForm"). Valid(); budzi walidacje dla wszystkich pól w formularzu. –

+0

Powiedziałbym, że to właściwa odpowiedź. Ponieważ, gdy użytkownik nie edytował jeszcze żadnych innych kontrolek, może zobaczyć czerwone ostrzeżenie w tych polach, co jest błędne. –

Powiązane problemy