2013-05-07 2 views
7

Ich habe eine clientseitige Validierung, die überprüft, ob die EndDate größer oder gleich StartDate ist. Die Validierung funktioniert, aber es schießt nicht so, wie ich es möchte. Ich möchte, dass es ausgelöst wird, sobald ein Datum auf dem Datepicker für EndDate ausgewählt wird. Wie kann ich das erreichen? Ich habe versucht, die folgenden:Wie kann ich die Validierung auf jQuery UI Datepicker auslösen, nachdem ein Datum ausgewählt wurde?

Datumsauswahl-Code:

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

Validierungscode:

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

Haben Sie das 'onSelect:' Ereignis versucht? –

+0

Ja habe ich. Etwas Merkwürdiges, das ich bemerke, ist, dass wenn ich eine Warnung in meine Validierung einfüge, es scheint, gerade zu feuern, wenn ich ein Datum auswähle, aber die Validierung nicht mehr funktioniert? Die Validierung funktioniert gut, wenn ich den 'focusout'-Teil entferne, aber er löst nicht aus, wie ich es möchte. –

Antwort

9

Sie die Validierer innerhalb unserer .focusout() Ereignis zuordnen. Entfernen Sie diesen Block vollständig, da Sie ihn nur einmal zuweisen möchten.

Sie können ganz einfach auslösen Validierung auf der onSelect Option wie folgt aus:

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

Danke! Das hat funktioniert! –

+0

Perfekt gearbeitet! –

9

Obwohl die Antwort von Mark arbeiten, sollten Sie beachten, dass es das gesamte Formular validieren. Wenn Sie nur das zugehörige Eingabefeld überprüfen möchten, würden Sie besser dran tun:

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

Dieser täuscht innerhalb des Eingabefeldes dem Benutzer klicken und es wieder verlassen.

+0

Diese Option funktioniert gut, weil $ ("# myForm"). Valid(); Weckt Validierungen für alle Felder im Formular. –

+0

Ich würde sagen, das ist die richtige Antwort. Wenn der Benutzer noch keine anderen Steuerelemente bearbeitet hat, sieht er in diesen Feldern möglicherweise eine rote Warnung, was falsch ist. –