2013-05-07 9 views
7

Ho una convalida sul lato client che verifica che lo EndDate sia maggiore o uguale a StartDate. La convalida funziona, ma non sta sparando come vorrei. Mi piacerebbe che si attivi appena è stata selezionata una data su DatePicker per EndDate. Come posso realizzare questo? Ho provato il seguente: codice diCome posso attivare la convalida su jQuery UI datepicker una volta che è stata selezionata una data?

Datepicker:

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

Codice di convalida:

$("#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

hai provato l'evento 'onSelect:'? –

+0

Sì, ho. Qualcosa di strano che sto notando è che quando inserisco un avviso all'interno della mia convalida, sembra che stia sparando bene quando prendo una data, ma la convalida non funziona più? La convalida funziona bene se rimuovo la parte 'focusout', ma non spara come voglio. –

risposta

9

si stanno assegnando i validatori all'interno del nostro evento .focusout(). Rimuovi quel blocco completamente come vuoi che vengano assegnati solo una volta.

Si può facilmente innescare convalida sull'opzione onSelect come la seguente:

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

Grazie Marco! Questo ha funzionato! –

+0

Perfettamente funzionante! –

9

Anche se la risposta di Mark funzionerà, si dovrebbe notare che sarà convalidare l'intero modulo. Se si desidera solo per convalidare il campo di immissione relativo, si sarebbe meglio fare:

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

Questa finge l'utente fa clic all'interno del campo di input e lasciando di nuovo.

+0

Questa opzione funziona bene, perché $ ("# myForm"). Valid(); risveglia le convalide per tutti i campi nel modulo. –

+0

Direi, questa è la risposta giusta. Perché quando l'utente non ha ancora modificato alcun altro controllo, potrebbe visualizzare un avviso rosso in quei campi, il che è sbagliato. –