2009-05-07 25 views

risposta

151

Proprio in espansione fuori fusioni rispondere. questo metodo di estensione funziona utilizzando il plugin jQuery validate. Si convaliderà date e numeri

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}.'); 

usarlo:

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

o

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

Come si usa questo con due caselle di testo? – Cros

+1

rules {texbox: {greaterThan: [textbox2.val()]}} o qualcosa del genere .. –

+0

Ho dovuto modificarlo leggermente per consentire date di fine vuote nella mia app, ma questo ha fatto la maggior parte. 'code' if (value == 0) { return true; } else if (!/Invalid | NaN/... 'code' –

-2

Se il formato è garantito per essere corretti AAAA/MM/DD ed esattamente la stessa tra i due campi è possibile utilizzare:

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

Come un confronto di stringhe

+0

come definire la data di inizio e la data di fine in jquery? – input

+0

Suppongo che siano stringhe regolari. Li leggi come $ (# startdate: input) .val() e $ (# enddate: input) .val() –

+0

Ti preghiamo di considerare la riformattazione di questa risposta ... – rickyduck

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

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

Questo dovrebbe penso che

+0

Giusto? Grazie! Nessun plugin necessario. : P –

+0

Bello. Codice semplice ... – Pramod

+0

bello e facile da implementare, anche se jQuery.validate è fantastico – mknopf

5

I valori di data dai campi di testo possono essere recuperati dal metodo jquery's .val() come

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

Consiglio vivamente di analizzare le stringhe di data prima di confrontarle. L'oggetto Date di Javascript ha un metodo parse() -, ma supporta solo i formati data USA (AAAA/MM/GG). Restituisce i millisecondi dall'inizio dell'epoca unix, quindi puoi semplicemente confrontare i tuoi valori con> o <.

Se si desidera formati diversi (ad esempio ISO 8661), è necessario ricorrere a espressioni regolari o alla libreria date.js gratuita.

Se vuoi essere super-utente, puoi usare jquery ui datepickers invece dei campi di testo. Esiste una variante datepicker che permette di inserire intervalli di date:

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

14

jquery.validate.js riferimento e jquery-1.2.6.js. Aggiungi una classe startDate alla casella di testo della data di inizio. Aggiungi una classe endDate alla casella di testo della data di fine.

Aggiungere questo blocco di script alla tua pagina: -

<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> 

Spero che questo aiuti :-)

+0

mi piace questa tecnica – wahmal

2

mi piace quello che ha detto Franz, perché è quello che sto usando: 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

Stavo solo armeggiando con danteuno's answer e ha rilevato che, pur avendo buone intenzioni, purtroppo è rotto su diversi browser che sono non IE. Questo perché IE sarà abbastanza severo su ciò che accetta come argomento per il costruttore Date, ma altri no. Ad esempio, Chrome 18 dà

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

questo modo il codice di prendere il sentiero "confrontare le date" e tutto va in discesa da lì (per esempionew Date("11") è maggiore di new Date("66") e questo è ovviamente l'opposto dell'effetto desiderato).

Pertanto, dopo aver preso in considerazione, ho modificato il codice per dare priorità al percorso "numeri" sul percorso "date" e verificare che l'input sia effettivamente numerico con l'eccellente metodo fornito in Validate decimal numbers in JavaScript - IsNumeric().

Alla fine, il codice diventa:

$.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

questo funziona, ma non riesco a farlo funzionare in opera e FF, qualche idea? – Codded

+0

@Codded: come funziona esattamente? – Jon

+0

: Viene visualizzato l'errore di convalida anche se la data di fine selezionata è successiva alla data di inizio selezionata – 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')); 
} 

Spero che questo vi aiuterà :)

3

quindi avevo bisogno di questa regola per essere facoltativa e nessuno dei suggerimenti di cui sopra sono opzionali. Se chiamo il metodo è mostrato come richiesto, anche se l'ho impostato per aver bisogno di un valore.

Questo è il mio invito:

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

mio addMethod non è così robusta come top rated risposta di Mike E., ma sto usando il DatePicker jQueryUI per forzare una selezione della data. Se qualcuno può dirmi come per assicurarsi che le date sono numeri e hanno il metodo sia opzionale che sarebbe grande, ma per ora questo metodo funziona per me:

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

poco in ritardo alla festa, ma qui è la mia parte

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

Ecco il dettaglio:

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) 
     } 
    }); 
}); 

o visitare a questo link

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

in Javascript/jquery la maggior parte dello sviluppatore utilizza Dal & A confronto data che è stringa, senza convertire in formato data. Il modo più semplice per confrontare dalla data è maggiore rispetto ad oggi è.

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

Sempre analizzare da e per la data prima del confronto per ottenere risultati accurati

+0

Ciò non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18026392) – Mamun

+0

È la soluzione alla domanda. Ho provato e ho risposto. –

Problemi correlati