2009-05-07 9 views

Antwort

151

einfach erweitern off-Fusionen. Diese Erweiterungsmethode funktioniert mit dem jQuery validate-Plugin. Es wird validieren Daten und Zahlen

jQuery.validator.addMethod("greaterThan", 
function(value, element, params) { 

    if (!/Invalid|NaN/.test(new Date(value))) { 
     return new Date(value) > new Date($(params).val()); 
    } 

    return isNaN(value) && isNaN($(params).val()) 
     || (Number(value) > Number($(params).val())); 
},'Must be greater than {0}.'); 

es zu benutzen:

$("#EndDate").rules('add', { greaterThan: "#StartDate" }); 

oder

$("form").validate({ 
    rules: { 
     EndDate: { greaterThan: "#StartDate" } 
    } 
}); 
+0

Wie benutzt man das mit zwei Textfeldern? – Cros

+1

Regeln {texbox: {greaterThan: [textbox2.val()]}} oder so ähnlich .. –

+0

Ich musste es leicht ändern, um leere Endtermine in meiner App zu erlauben, aber dies tat die Masse. 'code' if (Wert == 0) { Rückgabe wahr; } sonst wenn (!/Ungültig | NaN/... 'code' –

-2

Wenn das Format korrekt YYYY/MM/DD und genau das gleiche sein zwischen den beiden Feldern gewährleistet ist, dann können Sie verwenden:

if (startdate > enddate) { 
    alert('error' 
} 

Als String-Vergleich

+0

wie definiere ich das Startdatum und das Enddatum in jquery? – input

+0

Ich gehe davon aus, dass es sich um normale Strings handelt. Sie lesen sie wie $ (# startdate: input) .val() und $ (# enddate: input) .val() –

+0

Bitte denken Sie daran, diese Antwort neu zu formatieren ... – rickyduck

73
var startDate = new Date($('#startDate').val()); 
var endDate = new Date($('#endDate').val()); 

if (startDate < endDate){ 
// Do something 
} 

Das sollte es tun ich denke,

+0

Richtig? Vielen Dank! Kein Plugin benötigt. : P –

+0

Schön. Einfacher Code ... – Pramod

+0

schön und einfach zu implementieren, obwohl jQuery.validate ist super – mknopf

5

die Datumswerte aus den Textfelder können durch jQuerys .val() Methode wie

geholt werden 210
var datestr1 = $('#datefield1-id').val(); 
var datestr2 = $('#datefield2-id').val(); 

Ich würde dringend empfehlen, die Datumszeichenfolgen vor dem Vergleich zu analysieren. Das Javascript-Date-Objekt hat eine parse() - Methode, unterstützt aber nur US-Datumsformate (JJJJ/MM/TT). Es gibt die Millisekunden seit Beginn der Unix-Epoche zurück, so dass Sie Ihre Werte einfach mit> oder < vergleichen können.

Wenn Sie verschiedene Formate (zum Beispiel ISO 8661) wollen, müssen Sie reguläre Ausdrücke oder die freie date.js Bibliothek zurückgreifen.

Wenn Sie super benutzerfreundlich sein wollen, können Sie jquery ui datepickers statt textfields verwenden. Es gibt eine Datumsauswahl-Variante, die Datumsbereiche eingeben können:

http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/

14

Referenz jquery.validate.js und jquery-1.2.6.js. Fügen Sie Ihrem Startdatum-Textfeld eine startDate-Klasse hinzu. Fügen Sie der Enddatums-Textbox eine endDate-Klasse hinzu.

dieses Skript Block zu Ihrer Seite hinzufügen: -

<script type="text/javascript"> 
    $(document).ready(function() { 
     $.validator.addMethod("endDate", function(value, element) { 
      var startDate = $('.startDate').val(); 
      return Date.parse(startDate) <= Date.parse(value) || value == ""; 
     }, "* End date must be after start date"); 
     $('#formId').validate(); 
    }); 
</script> 

Hoffnung hilft dies :-) antworten

+0

ich mag diese Technik – wahmal

2

Ich mag, was Franz sagte, weil das, was ich bin mit: P

var date_ini = new Date($('#id_date_ini').val()).getTime(); 
var date_end = new Date($('#id_date_end').val()).getTime(); 
if (isNaN(date_ini)) { 
// error date_ini; 
} 
if (isNaN(date_end)) { 
// error date_end; 
} 
if (date_ini > date_end) { 
// do something; 
} 
13

Ich bastelte gerade mitundfestgestellt, dass während gut gemeinten, leider ist es auf mehreren Browsern gebrochen, die nicht IE sind. Dies liegt daran, IE wird ziemlich streng sein, was es als Argument für die Date Konstruktor akzeptiert, aber andere nicht. Zum Beispiel Chrome 18 gibt

> new Date("66") 
    Sat Jan 01 1966 00:00:00 GMT+0200 (GTB Standard Time) 

Dieser den Code bewirkt, dass die „Daten vergleichen“ Weg zu nehmen und es geht alles bergab von dort (znew Date("11") ist größer als new Date("66") und dies ist offensichtlich das Gegenteil des gewünschten Effekts).

Daher habe ich den Code geändert, um dem "Zahlen" -Pfad über den "Datums" -Pfad Priorität einzuräumen und zu bestätigen, dass die Eingabe tatsächlich numerisch ist, mit der ausgezeichneten Methode, die in Validate decimal numbers in JavaScript - IsNumeric() bereitgestellt wird.

Am Ende wird der Code:

$.validator.addMethod(
    "greaterThan", 
    function(value, element, params) { 
     var target = $(params).val(); 
     var isValueNumeric = !isNaN(parseFloat(value)) && isFinite(value); 
     var isTargetNumeric = !isNaN(parseFloat(target)) && isFinite(target); 
     if (isValueNumeric && isTargetNumeric) { 
      return Number(value) > Number(target); 
     } 

     if (!/Invalid|NaN/.test(new Date(value))) { 
      return new Date(value) > new Date(target); 
     } 

     return false; 
    }, 
    'Must be greater than {0}.'); 
+0

das funktioniert in ie aber kann es nicht funktionieren in Oper und FF, irgendwelche Ideen? – Codded

+0

@Codded: Wie genau funktioniert es nicht? – Jon

+0

: Es erscheint der Validierungsfehler, selbst wenn das ausgewählte Enddatum nach dem ausgewählten Startdatum liegt – Codded

1
function endDate(){ 
    $.validator.addMethod("endDate", function(value, element) { 
     var params = '.startDate'; 
     if($(element).parent().parent().find(params).val()!=''){ 
      if (!/Invalid|NaN/.test(new Date(value))) { 
       return new Date(value) > new Date($(element).parent().parent().find(params).val()); 
      } 
     return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) > parseFloat($(element).parent().parent().find(params).val())) || value == "";    
     }else{ 
     return true; 
     } 
     },jQuery.format('must be greater than start date')); 

} 

function startDate(){ 
      $.validator.addMethod("startDate", function(value, element) { 
      var params = '.endDate'; 
      if($(element).parent().parent().parent().find(params).val()!=''){ 
       if (!/Invalid|NaN/.test(new Date(value))) { 
        return new Date(value) < new Date($(element).parent().parent().parent().find(params).val()); 
      } 
      return isNaN(value) && isNaN($(element).parent().parent().find(params).val()) || (parseFloat(value) < parseFloat($(element).parent().parent().find(params).val())) || value == ""; 
       } 
         else{ 
        return true; 
} 

    }, jQuery.format('must be less than end date')); 
} 

Hope this helfen :)

3

Also brauchte ich diese Regel optional zu sein und keine der oben genannten Vorschläge sind optional. Wenn ich die Methode anrufe, wird sie wie gewünscht angezeigt, auch wenn ich sie auf einen Wert setze.

Das ist mein Aufruf:

$("#my_form").validate({ 
    rules: { 
     "end_date": { 
     required: function(element) {return ($("#end_date").val()!="");}, 
     greaterStart: "#start_date" 
     } 
    } 
    });//validate() 

Mein addMethod ist nicht so robust wie Mike E. Top bewertete Antwort, aber ich bin mit dem jQueryUI picker einer aktuellen Auswahl zu erzwingen. Wenn jemand kann mir sagen, wie man sicherstellen, dass die Daten sind Zahlen sein und haben das Verfahren optional das wäre toll, aber jetzt diese Methode funktioniert für mich:

jQuery.validator.addMethod("greaterStart", function (value, element, params) { 
    return this.optional(element) || new Date(value) >= new Date($(params).val()); 
},'Must be greater than start date.'); 
15

wenig spät zur Party, aber hier ist mein Teil

Date.parse(fromDate) > Date.parse(toDate)

Hier ist das Detail:

var from = $("#from").val(); 
var to = $("#to").val(); 

if(Date.parse(from) > Date.parse(to)){ 
    alert("Invalid Date Range"); 
} 
else{ 
    alert("Valid date Range"); 
} 
2
$(document).ready(function(){ 
    $("#txtFromDate").datepicker({ 
     minDate: 0, 
     maxDate: "+60D", 
     numberOfMonths: 2, 
     onSelect: function(selected) { 
      $("#txtToDate").datepicker("option","minDate", selected) 
     } 
    }); 

    $("#txtToDate").datepicker({ 
     minDate: 0, 
     maxDate:"+60D", 
     numberOfMonths: 2, 
     onSelect: function(selected) { 
      $("#txtFromDate").datepicker("option","maxDate", selected) 
     } 
    }); 
}); 

oder Besuch dieser link

1
jQuery('#from_date').on('change', function(){ 
    var date = $(this).val(); 
    jQuery('#to_date').datetimepicker({minDate: date}); 
}); 
1

In Javascript/jquery die meisten der Entwickler verwendet Von & Bisher Vergleich die Zeichenfolge ist, ohne in das Datumsformat zu konvertieren. Der einfachste Weg zum Vergleich von Datum ist größer als bis heute ist.

Date.parse(fromDate) > Date.parse(toDate) 

analysieren immer aus und bisher vor dem Vergleich zu genauen Ergebnissen

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/18026392) – Mamun

+0

Es ist die Lösung zu hinterfragen. Ich habe es versucht und beantwortet. –

Verwandte Themen