Rufen Sie die native Datumsauswahl über die Web-App unter iOS / Android auf


79

Ich versuche, die Möglichkeiten zu erkunden, indem ich eine native Web-App auf verschiedenen Plattformen mit HTML5 ausführe. Derzeit <input type="date">öffnet ein Feld nur die Standard-Softtastatur für Android und iOS. Ich nehme an, dass die Softtastaturen des mobilen Betriebssystems in Zukunft Datumsauswahl und dergleichen enthalten werden - genau wie <select>die native Auswahl heute aufgerufen wird.

Da dies weder auf Android noch auf iOS implementiert ist, sondern auf der nativen Benutzeroberfläche, kann eine Web-App die native Datumsauswahl aufrufen, dh wenn Sie darauf klicken?

Dies würde es uns ermöglichen, die Verwendung von JavaScript-Bibliotheken wie jQuery Mobile und YUI einzustellen.

Wenn meine Frage in irgendeiner Weise unklar ist, sagen Sie es mir bitte. Danke im Voraus :-)



Ich fand, dass der einfachste Weg wäre, die native Datumsauswahl mit Javascript zu verwenden input[type=text]und dann zu ng-clicköffnen.
Siddharth

1
@Siddharth Das ist ein anständiger Vorschlag ... aus irgendeinem Grund zeigt der Eingabetyp = Datum unter Android 7 eine völlig andere Auswahl an als die native Datumsauswahl (Sie können sie beispielsweise nicht mit dem Finger durchblättern). Wie öffnet man eigentlich die "native" Datumsauswahl in Javascript?
Michael

Antworten:


105

Seit einigen Jahren unterstützen einige Geräte <input type="date">, andere jedoch nicht. Daher muss man vorsichtig sein. Hier einige Beobachtungen aus dem Jahr 2012, die heute noch gültig sein könnten:

  • Sie können feststellen, ob dies type="date"unterstützt wird, indem Sie dieses Attribut festlegen und dann seinen Wert zurücklesen. Browser / Geräte, die dies nicht unterstützen, ignorieren das Setzen des Typs auf dateund kehren textbeim Zurücklesen dieses Attributs zurück. Alternativ kann Modernizr zur Erkennung verwendet werden. Beachten Sie, dass es nicht ausreicht, nach einer Android-Version zu suchen. wie das Samsung Galaxy S2 auf Android 4.0.3 unterstützt type="date", aber das Google / Samsung Nexus S auf dem neueren Android 4.0.4 nicht .

  • Stellen Sie beim Voreinstellen des Datums für die native Datumsauswahl sicher, dass Sie ein Format verwenden, das das Gerät erkennt. Wenn Sie dies nicht tun, lehnen Geräte es möglicherweise stillschweigend ab und lassen ein leeres Eingabefeld übrig, wenn Sie versuchen, einen vorhandenen Wert anzuzeigen. Wie bei der Verwendung der Datumsauswahl auf einem Galaxy S2 mit Android 4.0.3 könnte sich das <input>auf 2012-6-1den 1. Juni einstellen . Beim Festlegen des Werts aus JavaScript werden jedoch führende Nullen benötigt : 2012-06-01.

  • Wenn Sie beispielsweise Cordova (PhoneGap) verwenden, um die native Datumsauswahl auf Geräten anzuzeigen, die Folgendes nicht unterstützen type="date":

    • Stellen Sie sicher, dass die integrierte Unterstützung ordnungsgemäß erkannt wird. Wie im Jahr 2012 auf dem Galaxy S2 mit Android 4.0.3, fälschlicherweise auch die Cordova Android - Plugin in welcher die Datumsauswahl zweimal in Folge führen würde: noch einmal nach „set“ in seinem ersten Auftreten klicken.

    • Wenn sich mehrere Eingaben auf derselben Seite befinden, zeigen einige Geräte "Zurück" und "Weiter" an, um in ein anderes Formularfeld zu gelangen. Unter iOS 4 löst dies den onclickHandler nicht aus und gibt dem Benutzer daher eine regelmäßige Eingabe. Die Verwendung onfocuszum Auslösen des Plugins schien besser zu funktionieren.

    • Unter iOS 4 wurde bei Verwendung von onclickoder onfocuszum Auslösen des 2012 iOS-Plugins zuerst die reguläre Tastatur angezeigt. Danach wurde die Datumsauswahl darüber gelegt. Nachdem Sie die Datumsauswahl verwendet hatten, musste die normale Tastatur noch geschlossen werden. Das $(this).blur()Entfernen des Fokus vor dem Anzeigen der Datumsauswahl half iOS 4 und wirkte sich nicht auf andere von mir getestete Geräte aus. Unter iOS wurde jedoch ein schnelles Blinken der Tastatur eingeführt, und bei der ersten Verwendung könnten die Dinge noch verwirrender sein, da die Datumsauswahl dann langsamer war. Man könnte die normale Tastatur vollständig deaktivieren, indem man die Eingabe readonlyvornimmt, wenn man das Plugin verwendet, aber das deaktiviert die Schaltflächen "Zurück" und "Weiter", wenn andere Eingaben auf demselben Bildschirm eingegeben werden. Es scheint auch, dass das iOS 4-Plugin die native Datumsauswahl nicht dazu gebracht hat, "Abbrechen" anzuzeigen.

    • Auf einem iOS 4 iPad (Simulator) schien das Cordova-Plugin 2012 nicht richtig zu rendern, sodass der Benutzer im Grunde keine Möglichkeit hatte, ein Datum einzugeben oder zu ändern. (Vielleicht rendert iOS 4 seine native Datumsauswahl nicht gut über einer Webansicht, oder vielleicht hat das CSS-Styling meiner Webansicht einen gewissen Effekt, und dies kann auf einem realen Gerät sicherlich anders sein: Bitte kommentieren oder bearbeiten!)

    • Auch 2012 versuchte das Android-Plugin für die Datumsauswahl, dieselbe JavaScript-API wie das iOS-Plugin zu verwenden, und das verwendete Beispiel allowOldDatesunterstützte die Android-Version tatsächlich nicht. Außerdem wurde das neue Datum zurückgegeben, 2012/7/2während die iOS-Version zurückgegeben wurde Mon Jul 02 2012 00:00:00 GMT+0200 (CEST).

  • Selbst wenn dies <input type="date">unterstützt wird, sehen die Dinge möglicherweise chaotisch aus:

    • iOS 5 wird 2012-06-01in einem lokalisierten Format wie 1 Jun. 2012oder angezeigt June 1, 2012(und aktualisiert es sogar sofort, während die Datumsauswahl noch ausgeführt wird). Das Galaxy S2 mit Android 4.0.3 zeigt jedoch das hässliche 2012-6-1oder 2012-06-01, egal welches Gebietsschema verwendet wird.

    • iOS 5 auf einem iPad (Simulator) verbirgt die Tastatur nicht, wenn dies bereits beim Berühren der Datumseingabe oder bei Verwendung von "Zurück" oder "Weiter" in einer anderen Eingabe sichtbar ist. Es zeigt dann gleichzeitig die Datumsauswahl unter der Eingabe und die Tastatur unten an und scheint jede Eingabe von beiden zuzulassen. Obwohl der sichtbare Wert geändert wird, wird die Tastatureingabe tatsächlich ignoriert. (Wird beim Zurücklesen des Werts oder beim erneuten Aufrufen der Datumsauswahl angezeigt.) Wenn die Tastatur noch nicht angezeigt wurde, wird beim Berühren der Datumseingabe nur die Datumsauswahl angezeigt, nicht die Tastatur. (Dies kann auf einem realen Gerät anders sein, bitte kommentieren oder bearbeiten!)

    • Geräte zeigen möglicherweise einen Cursor im Eingabefeld an, und ein langes Drücken löst möglicherweise die Optionen für die Zwischenablage aus, möglicherweise auch die normale Tastatur. Beim Klicken wird auf einigen Geräten möglicherweise sogar für den Bruchteil einer Sekunde die normale Tastatur angezeigt, bevor die Datumsauswahl angezeigt wird.


Können Sie bestätigen, dass das Plugin tatsächlich das native Steuerelement auslöst (im Gegensatz zum Rendern einer JS-Emulation des nativen Steuerelements)?
DA.

Nun, die ursprüngliche Frage bezieht sich darauf, dies im Webbrowser selbst zu tun. Ihre Antwort geht jedoch in das Gebiet von PhoneGap, und die „Fallstricke“ schienen darauf hinzudeuten, dass PhoneGap möglicherweise nicht das native Steuerelement auslöste, sondern JavaScript verwendete, um das native Steuerelement nachzuahmen. Wenn ich Ihre Antwort verstehe, löst das PhoneGap-Plug-In tatsächlich die Datumsauswahl für das Betriebssystem des nativen Geräts außerhalb der mobilen Safari aus.
DA.

Ich bin immer noch ein wenig verwirrt darüber, was das PhoneGap-Plugin auslöst. Sie geben beispielsweise an, dass das iPad Probleme beim Rendern hat. Warum wird das native Steuerelement falsch dargestellt? (Ich werde auch meine älteren Fragen durchgehen ...)
DA.

Warum das iPad (Simulator) beim Auslösen über das Plugin keine eigene native Datumsauswahl anzeigt, weiß ich leider nicht. Vielleicht stimmt etwas im Objective C-Code des Plugins nicht, oder es ist problematisch, die Datumsauswahl über einer Webansicht anzuzeigen, oder vielleicht wirkt sich sogar das CSS-Styling der von mir verwendeten Webseite irgendwie darauf aus (obwohl dies nicht der Fall sein sollte) ). Aber alles dreht sich um die einheimischen Datumsauswahl; Werfen Sie einen Blick in Java , es ist ziemlich klein.
Arjan

1
Eine Einschränkung: Unter iOS wird das Ereignis "onchange" ausgelöst, wenn Sie nur eines der drei Steuerelemente für Tag / Monat / Jahr ändern. Dies ist verfrüht, da der Benutzer möglicherweise mehrere ändert und dann auf "Fertig" tippt, um das neue Datum zu bestätigen. Ich musste stattdessen das Ereignis "onblur" verwenden.
EoghanM

14

iOS 5 unterstützt jetzt HTML5 besser. in Ihrer Webapp tun

<input type="date" name="date" />

Android ab 4.0 fehlt diese Art der nativen Menüunterstützung.


3
Ihre Antwort ist genauso richtig wie die von Eirik Hoem. Android 4.0 unterstützt dies immer noch nicht. Dies ist eine Katastrophe. Schande über dich, Google!
Hnilsen

Heutzutage unterstützt Android 4.0.3 auf dem Samsung Galaxy S2 dies, 4.0.4 auf dem Nexus S jedoch nicht, @hnilsen.
Arjan

Äh, nein: Ich sage nicht, dass Android 4.0.3 es unterstützt, aber: Android 4.0.3 auf dem Galaxy S2 tut es ...
Arjan

Ich benutze dies für Android in der ionischen App. Es funktioniert gut, aber ich mache diese Eingabe als verstecktes und auslösendes Klickereignis, wenn der Benutzer auf div klickt, damit es nicht funktioniert. irgendeine Idee?
Jay Shukla


5

Probieren Sie Mobiscroll aus . Die Datums- und Uhrzeitauswahl im Scroller-Stil wurde speziell für die Interaktion mit Touch-Geräten entwickelt. Es ist ziemlich flexibel und leicht anpassbar. Es kommt mit iOS / Android-Themen.


2
Hm, das ist im Grunde das Gegenteil von dem, was ich verwenden würde. Es ist nicht schnell, nicht einfach zu warten und sieht nur nach iOS, Standard-Android und Sense aus. Vielen Dank für Ihren Beitrag :-)
hnilsen

Ich finde Mobiscroll im nativen HTC Desire-Browser sehr fehlerhaft und unzuverlässig. Bestenfalls scheint es nachlässig zu sein, aber häufig bleibt der Bildlauf hängen, so dass er nur ununterbrochen durch die Daten flitzt.
Leo

Es funktioniert viel besser unter iOS. Allerdings ... verwende ich es auf dem HTC Desire HD und das 2.0 scheint verbessert zu sein. Und es scheint noch besser auf anderen Android-Browsern zu funktionieren, wie zum Beispiel Dolphin.
Levi Kovacs

Beachten Sie, dass WP7 nicht von mobiscroll unterstützt wird und dieses Bug-Ticket seit über einem Jahr geöffnet ist
Parker Ault

Wo ist die Windows Phone-Unterstützung? Siehe Beitrag: blog.mobiscroll.com/where-is-the-windows-phone-support
Levi Kovacs

3

Meine Antwort ist zu simpel. Wenn Sie einfachen Code schreiben möchten , der plattformübergreifend funktioniert, verwenden Sie die window.prompt- Methode, um den Benutzer nach einem Datum zu fragen. Natürlich müssen Sie mit einem regulären Ausdruck validieren und dann das Datumsobjekt erstellen.

function onInputClick(e){
var r = window.prompt("Give me a date (YYYY-MM-DD)", "2014-01-01");
if(/[\d]{4}-[\d]{1,2}-[\d]{1,2}/.test(r)){
    //date ok
    e.value=r;
    var split=e.value.split("-");
    var date=new Date(parseInt(split[0]),parseInt(split[1])-1,parseInt(split[2]));
}else{
    alert("Invalid date. Try again.");
}
}

In Ihrem HTML:

<input type="text" onclick="onInputClick(this)" value="2014-01-01">

Nett. Siehe aber auch Erkennen einer Datumsinstanz mit ungültigem Datum in JavaScript . (Sie könnten versuchen, den regulären Ausdruck ein bisschen besser zu machen, indem Sie keine Monate> 12 akzeptieren, aber der maximale Tag wäre immer noch schwierig.)
Arjan


0

In HTML:

  <form id="my_form"><input id="my_field" type="date" /></form>

In JavaScript

   // test and transform if needed
    if($('#my_field').attr('type') === 'text'){
        $('#my_field').attr('type', 'text').attr('placeholder','aaaa-mm-dd');  
    };

    // check
    if($('#my_form')[0].elements[0].value.search(/(19[0-9][0-9]|20[0-1][0-5])[- \-.](0[1-9]|1[012])[- \-.](0[1-9]|[12][0-9]|3[01])$/i) === 0){
        $('#my_field').removeClass('bad');
    } else {
        $('#my_field').addClass('bad');
    };


-6

Verwenden Sie auf Ihrem Formular Elemente input type="time". Dies erspart Ihnen den Aufwand, eine Datenauswahlbibliothek zu verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.