2013-10-08 23 views
6

Alternativ ist es möglich mit html5 gegen den Wert eines anderen Feldes zu validieren?Wie verwende ich HTML5, um einen Datumsbereich zu validieren?

Ein häufiges Beispiel wäre die Auswahl eines Datumsbereichs, in dem das "von" Datum kleiner oder gleich dem "bis" Datum sein sollte. Im Folgenden würde beschrieben die gewünschte Beziehung zwischen den Werten, wenn nur Sie Elementreferenzen in Syntax verwenden:

<input type="date" name="from" max="to"> //todo: populate with ~to.value 
<input type="date" name="to" min="from"> //todo: populate with ~from.value 
+1

'min' und' max' attrs sind das 'date' Format, nicht Element \ –

+0

@EL: Ich bin mir der Einschränkung bewusst (oder genauer gesagt, die Beschränkung von Werten auf ein ISO Format), das Beispiel war beabsichtigt als Pseudo-Markup dienen, das die gewünschte Beziehung zwischen den Werten zeigt. Ich habe es aktualisiert, um [hoffentlich] die Ambiguität zu entfernen, danke! –

+0

Der einfache Weg, um es zu tun ist, eine Datumsauswahl und eine "Anzahl von Tagen" Kontrolle zu haben. – robertc

Antwort

2

Es ist möglich, html5 Validierungsmechanismus mit einigen Javascript zu verwenden, dynamisch min/max Attribute zu aktualisieren:

//in this case a single input restriction is sufficient to validate the form: 

$('#from, #to').on('change', function(){ 
    $('#to').attr('min', $('#from').val()); 
}); 

Fiddled. Sowohl min als auch max können auf die entsprechenden Felder für erweitertes UX angewendet werden, wenn die Browserimplementierung eines Datepickers Bereichsbeschränkungen respektiert (indem Daten außerhalb des gewünschten Bereichs deaktiviert werden)

+3

Hier ist ein weiteres Beispiel mit einem Polyfill: http://jsfiddle.net/trixta/SWQme/ –

-1

Ich mache mir Sorgen, dass es keine Möglichkeit gibt, ein zu validieren Eingabewert basierend auf anderen Eingabewerten. Nur gutes altes Javascript.

Aber vielleicht können Sie <input type="range" …> verwenden und einen minimalen Schritt (1 Tag/1 Stunde/...) einstellen. Dann können Sie min und max Wert von gleichnamigen Attributen verwenden.

+0

Wie soll man das tun? benutze [''] (http://diveintohtml5.info/examples/input-type-range.html) um ein Datum auszuwählen? –

3

Hier sind Web Components sehr nützlich, aber sie werden noch nicht vollständig in allen Browsern unterstützt.

Die Idee ist es, eine einfache HTML-Element, mit zwei Kindern zu schaffen (von und nach) wie folgt zusammen:

<div id="fromToDate"> 
    <div></div> 
    <div></div> 
</div> 

dann eine Vorlage erstellen, die definiert, wie die Datumsauswahl aussehen sollte:

<template id="fromToDateTemplate"> 
    <label for="fromDate">from</label> 
    <input type="date" class="fromDate" select=":first" required="" /> 
    <label for="toDate">to</label> 
    <input type="date" class="toDate" select=":last" required="" /> 
</template> 

Der Select-Parameter definiert, woher der Wert genommen wird, also nimmt das erste Eingabefeld das erste Div von "#fromToDate".

Zuletzt haben wir den „Schatten root“ bevölkern und die Logik definieren:

var shadow = document.querySelector('#fromToDate').webkitCreateShadowRoot(), 
    template = document.querySelector('#fromToDateTemplate'); 
shadow.appendChild(template.content); 


shadow.querySelector(".fromDate").addEventListener("change", function (e) { 
    var to = this.value; 

    shadow.querySelector(".toDate").setAttribute("min", this.value); 
}); 

template.remove(); 

am Ende zwei Eingabefelder sind renderd und wenn ein Datum in den ersten picker Auswahl, kann der zweite picker nicht Wählen Sie irgendwelche niedrigeren Daten.

Fiddler Beispiel: http://jsfiddle.net/cMS9A/

Vorteile:

  • Bauen als Widget
  • Leicht
  • reause nicht Seiten brechen
  • unabhängig

gestylt werden Nachteil ges:

  • Noch nicht

Zukunft Lesen in allen Browsern unterstützt:

+0

Interessante Richtung, aber IMHO das ist nicht etwas für mein Szenario, da die gleiche Logik ohne Schatten DOM oder die Cross-Browser-Einschränkungen, mit denen es kommt, repliziert werden kann. Es sieht so aus, als ob ein Schatten-DOM besser für eine Zwischenlogik geeignet ist, z.B. Wenn Sie separate Legacy-Eingaben für Datum/Monat/Jahr hätten, könnten diese in eine "Eingabe [Typ = Datum]" "eingewickelt" werden (Spoiler-Warnung: Wenn Sie das Beispiel jfiddle untersuchen, zeigt DOM das "Original" Markup). –

+1

Ich muss dir zustimmen. Die Tatsache, dass dies nicht in allen Browsern unterstützt wird, macht dies nicht zu einer guten Wahl für die Produktion, auch das Konzept von Shadow DOM ist noch nicht allgemein bekannt, daher könnte eine Lösung mit jQuery jetzt besser sein. Eine eingebaute HTML5-Funktion existiert meiner Meinung nach nicht, da HTML jedes DOM-Element unabhängig behandelt, um eine Verbindung zwischen ihnen herzustellen, haben Sie JavaScript. Mit meiner Lösung sind Sie nicht auf eine Bibliothek von Drittanbietern angewiesen und können sie wiederverwenden, also musste ich sie teilen. – Stefan

0

Wenn Sie Fragen zu vermeiden, mit jemand Hacking/yor Website Absturz - Eingangsdaten mit bestätigen:

  • (optional) javascript bevor ein Formular (schützt vor malforming Daten mit Hilfe von Javascript zu senden, falsche einer Eingabe reduziert Verkehr)
  • (Pflicht) auf Server-Seite (schützt vor cleveren Jungs, die Dateneingabe mit Fiedler zum Beispiel malform könnte)

Dies ist der einzigen (mindestens zweiter Punkt) App Plötze, die dich und deine Site schützt.

+1

Ich weiß nicht, warum das heruntergeregelt wurde, es ist nie eine schlechte Idee, auf die Notwendigkeit einer serverseitigen Validierung hinzuweisen, wenn die clientseitige Validierung diskutiert wird. Meine Absicht ist jedoch, das UX von echten (nicht bösartigen) Benutzern zu verbessern; Wenn Sie sich die [Geige] (http://jsfiddle.net/ovfiddle/GS98P/2/) von [meine ursprüngliche Antwort] (http://stackoverflow.com/a/19239320/1081234) ansehen, werden Sie das bemerken Nachdem ein "Von" -Datum ausgewählt wurde, können Sie kein "Nachher" -Datum mehr auswählen - native Datepicker-Elemente respektieren die "Min" -Einschränkung und deaktivieren Daten davor. –

0

Es ist großartig zu sehen, wie sich die Dinge in Richtung einer reinen HTML-Lösung entwickeln ... aber warum sollte man sich nicht kurz mit moment.js beschäftigen, um die Lücken zu füllen?

http://momentjs.com/

Es gibt viele gute Beispiele gibt und viele nützliche Utility-Methoden.

+0

Ich benutze Momentjs bereits für ein paar Dinge (weil Datumsmanipulation und Formatierung ohne ein Framework in JS saugt), aber ich sehe nicht, wie dies mit min/max für Datepickers helfen würde. –

+1

Kühl. Ich zeigte auf etwas wie das: https://github.com/gf3/moment-range – backdesk