Wywołaj natywny selektor dat z aplikacji internetowej na iOS / Android

79

Próbuję zbadać możliwości uruchamiania natywnej aplikacji internetowej na różnych platformach przy użyciu HTML5. Obecnie <input type="date">pole po prostu otwiera standardową klawiaturę programową w systemie Android i iOS. Przypuszczam, że w przyszłości klawiatury programowe mobilnego systemu operacyjnego będą zawierały narzędzia <select>do wybierania dat i tym podobne - tak jak dziś wywołuje natywny wybór.

Ponieważ nie jest to zaimplementowane w systemie Android ani iOS, ale jest zaimplementowane w natywnym interfejsie użytkownika, czy aplikacja internetowa może wywołać natywny selektor dat, tj. Po kliknięciu?

Umożliwiłoby to nam zaprzestanie korzystania z bibliotek JavaScript, takich jak jQuery mobile i YUI.

Jeśli moje pytanie jest niejasne, proszę, powiedz mi. Z góry dziękuję :-)

hnilsen
źródło
Zobacz także stackoverflow.com/questions/388814/…
Daniel Trebbien
Odkryłem, że najłatwiej byłoby użyć, input[type=text]a następnie ng-clickotworzyć natywny selektor dat za pomocą javascript.
Siddharth
1
@Siddharth To przyzwoita sugestia ... z jakiegoś powodu w systemie Android 7 typ wejścia = data wyświetla zupełnie inny selektor niż natywny selektor dat (na przykład nie można go przewijać palcem). A tak przy okazji, jak w ogóle otworzyć „natywny” selektor dat w javascript?
Michael

Odpowiedzi:

105

Od kilku lat niektóre urządzenia obsługują, <input type="date">a inne nie, więc trzeba być ostrożnym. Oto kilka obserwacji z 2012 roku, które nadal mogą być aktualne:

  • Można wykryć, czy type="date"jest obsługiwany, ustawiając ten atrybut, a następnie odczytując jego wartość. Przeglądarki / urządzenia, które go nie obsługują, zignorują ustawienie typu na datei zwrócą textpodczas odczytu tego atrybutu. Alternatywnie do wykrywania można użyć Modernizr . Uważaj, nie wystarczy sprawdzić, czy jest jakaś wersja Androida; jak Samsung Galaxy S2 na Androidzie 4.0.3 obsługuje type="date", ale Google / Samsung Nexus S na nowszą Androida 4.0.4 robi nie .

  • Ustawiając datę dla natywnego selektora dat, upewnij się, że używasz formatu rozpoznawanego przez urządzenie. Gdy tego nie robią, urządzenia mogą po cichu je odrzucić, pozostawiając puste pole wejściowe podczas próby wyświetlenia istniejącej wartości. Jak za pomocą selektora dat na Galaxy S2 z Androidem 4.0.3 potęgę sam ustawić <input>aby 2012-6-1na 1 czerwca. Jednak, gdy ustawienie wartości z JavaScript, potrzebuje zer: 2012-06-01.

  • Podczas używania rzeczy takich jak Cordova (PhoneGap) do wyświetlania natywnego selektora dat na urządzeniach, które nie obsługują type="date":

    • Pamiętaj, aby prawidłowo wykryć wbudowaną obsługę. Podobnie jak w 2012 roku na Galaxy S2 z systemem Android 4.0.3, błędnie również użycie wtyczki Cordova dla Androida skutkowałoby wyświetleniem selektora dat dwa razy z rzędu: po raz kolejny po kliknięciu „ustaw” w pierwszym wystąpieniu.

    • Gdy na tej samej stronie znajduje się wiele danych wejściowych, niektóre urządzenia wyświetlają „poprzednie” i „następne”, aby przejść do innego pola formularza. W systemie iOS 4 nie wyzwala to programu onclickobsługi, a zatem zapewnia użytkownikowi regularne dane wejściowe. Używanie onfocusdo uruchamiania wtyczki wydawało się działać lepiej.

    • W systemie iOS 4 użycie onclicklub onfocusdo wyzwolenia wtyczki iOS 2012 najpierw powodowało zwykłe wyświetlanie klawiatury, po czym selektor dat został umieszczony na górze. Następnie, po użyciu selektora dat, nadal trzeba było zamknąć zwykłą klawiaturę. Użycie $(this).blur()do usunięcia fokusu przed pokazaniem selektora dat było pomocne w iOS 4 i nie miało wpływu na inne testowane urządzenia. Ale wprowadził szybkie flashowanie klawiatury na iOS, a przy pierwszym użyciu rzeczy mogą być jeszcze bardziej zagmatwane, ponieważ wtedy selektor daty był wolniejszy. Można by całkowicie wyłączyć zwykłą klawiaturę, wprowadzając dane wejściowe, readonlygdyby korzystano z wtyczki, ale to wyłączało przyciski „poprzedni” i „następny” podczas wpisywania innych wejść na tym samym ekranie. Wygląda również na to, że wtyczka iOS 4 nie powodowała, że ​​natywny selektor dat pokazywał „anuluj”

    • Na iPadzie z systemem iOS 4 (symulator) w 2012 r. Wtyczka Cordova nie wydawała się poprawnie renderować, w zasadzie nie dając użytkownikowi żadnej możliwości wprowadzenia lub zmiany daty. (Może iOS 4 nie renderuje dobrze swojego natywnego selektora dat w widoku sieciowym, a może styl CSS mojego widoku internetowego ma jakiś wpływ i na pewno może to wyglądać inaczej na prawdziwym urządzeniu: proszę komentuj lub edytuj!)

    • Chociaż ponownie w 2012 r. Wtyczka do wybierania dat dla Androida próbowała używać tego samego interfejsu API JavaScript, co wtyczka iOS i jej przykład allowOldDates, wersja na Androida w rzeczywistości tego nie obsługiwała. Ponadto zwrócił nową datę, 2012/7/2gdy wróciła wersja na iOS Mon Jul 02 2012 00:00:00 GMT+0200 (CEST).

  • Nawet jeśli <input type="date">jest obsługiwany, rzeczy mogą wyglądać niechlujnie:

    • iOS 5 ładnie wyświetla się 2012-06-01w zlokalizowanym formacie, takim jak 1 Jun. 2012lub June 1, 2012(a nawet aktualizuje, że natychmiast, podczas gdy nadal działa selektor dat). Jednak Galaxy S2 z systemem Android 4.0.3 pokazuje brzydkie 2012-6-1lub 2012-06-01, bez względu na używane ustawienie regionalne.

    • iOS 5 na iPadzie (symulatorze) nie ukrywa klawiatury, gdy jest ona już widoczna po dotknięciu daty lub podczas używania „poprzedni” lub „następny” w innym wejściu. Następnie jednocześnie pokazuje selektor dat pod wejściem i klawiaturą na dole i wydaje się zezwalać na dowolne wejście z obu. Jednak mimo że zmienia widoczną wartość, dane wprowadzane z klawiatury są w rzeczywistości ignorowane. (Wyświetlane podczas odczytywania wartości lub przy ponownym wywołaniu selektora dat). Gdy klawiatura nie była jeszcze wyświetlana, dotknięcie pola wprowadzania daty powoduje wyświetlenie tylko selektora dat, a nie klawiatury. (Może to wyglądać inaczej na prawdziwym urządzeniu, prosimy o komentarz lub edycję!)

    • Urządzenia mogą wyświetlać kursor w polu wprowadzania, a długie naciśnięcie może wywołać opcje schowka, prawdopodobnie pokazując również zwykłą klawiaturę. Po kliknięciu niektóre urządzenia mogą nawet wyświetlać zwykłą klawiaturę przez ułamek sekundy, zanim zmienisz się w celu wyświetlenia selektora dat.

Arjan
źródło
Czy możesz potwierdzić, że wtyczka faktycznie wyzwala natywną kontrolę (a renderowanie emulacji JS natywnej kontroli)?
DA.
Cóż, pierwotne pytanie dotyczy zrobienia tego w samej przeglądarce internetowej. Twoja odpowiedź trafia jednak na terytorium PhoneGap, a „pułapki” zdawały się sugerować, że być może PhoneGap nie wyzwalał natywnej kontroli, ale raczej używał JavaScript do naśladowania natywnej kontroli. Ale jeśli rozumiem twoją odpowiedź, wtyczka PhoneGap faktycznie uruchamia natywny selektor daty systemu operacyjnego urządzenia poza mobilnym safari.
DA.
Nadal jestem trochę zdezorientowany, co uruchamia wtyczka PhoneGap. Na przykład stwierdzasz, że iPad ma problemy z renderowaniem. Dlaczego miałby niepoprawnie renderować natywną kontrolę? (Przejdę też przez moje starsze pytania ...)
DA.
Dlaczego iPad (symulator) nie pokazuje własnego natywnego selektora dat po uruchomieniu z wtyczki, niestety nie wiem. Może coś w kodzie wtyczki Objective C jest nie tak, a może w jakiś sposób kłopotliwe jest wyświetlenie selektora dat na górze strony internetowej, a może nawet styl CSS strony internetowej, z której korzystam, jakoś na to wpływa (chociaż nie powinien ). Ale wszystko dotyczy rodzimych zbieraczy dat; zajrzyj do Java , jest dość mała.
Arjan
1
Ostrzeżenie: w systemie iOS zdarzenie „zmiany” uruchamia się, gdy zmienisz tylko jedną z 3 kontrolek dzień / miesiąc / rok. Jest to przedwczesne, ponieważ użytkownik może zmienić więcej niż jedną datę, a następnie nacisnąć przycisk „Gotowe”, aby potwierdzić nową datę. Zamiast tego musiałem użyć zdarzenia „onblur”.
EoghanM
14

iOS 5 obsługuje teraz lepiej HTML5. w swojej aplikacji internetowej

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

Android od wersji 4.0 nie ma tego typu natywnej obsługi menu.

Nerw
źródło
3
Twoja odpowiedź jest równie słuszna, jak odpowiedź Eirika Hoema. Android 4.0 nadal nie obsługuje tego, to katastrofa. Wstydź się, Google!
hnilsen
Obecnie Android 4.0.3 na Samsungu Galaxy S2 obsługuje to, ale 4.0.4 na Nexusie S nie, @hnilsen.
Arjan
Eee, nie: nie mówię, że Android 4.0.3 to obsługuje, ale: Android 4.0.3 na Galaxy S2 obsługuje ...
Arjan
Używam tego dla Androida w aplikacji ionic. Działa dobrze, ale wprowadzam te dane wejściowe jako ukryte i uruchamiające zdarzenie kliknięcia, gdy użytkownik kliknie element div, więc nie działa. dowolny pomysł?
Jay Shukla
5

iOS5 obsługuje to ( odniesienie ). Jeśli chcesz wywołać natywny selektor dat, możesz mieć opcję z PhoneGap (sam tego nie testowałem).

Eirik Hoem
źródło
1
Możesz użyć natywnego pickerView z PhoneGap / Cordova z następującą wtyczką: github.com/mgcrea/cordova-pickerview
Olivier
5

Wypróbuj Mobiscroll . Selektor daty i czasu w stylu scrollera został stworzony specjalnie do interakcji na urządzeniach dotykowych. Jest dość elastyczny i łatwo konfigurowalny. Zawiera motywy iOS / Android.

Levi Kovacs
źródło
2
Hm, to w zasadzie przeciwieństwo tego, czego bym użył. Nie jest szybki, nie jest łatwy w utrzymaniu i nie wygląda jak nic poza iOS, domyślnym Androidem i Sense. Dziękuję jednak za wkład :-)
hnilsen
Uważam, że mobiscroll jest bardzo błędny i zawodny w natywnej przeglądarce HTC Desire. W najlepszym przypadku wydaje się opóźniony, ale często przewijanie się kije, więc po prostu ciągle przegląda daty.
Leo
Działa znacznie lepiej na iOS. Jednak ... Używam go na HTC Desire HD i 2.0 wydaje się ulepszony. Wydaje się, że działa jeszcze lepiej w innych przeglądarkach z Androidem, na przykład Dolphin.
Levi Kovacs
Należy pamiętać, że WP7 nie jest obsługiwany przez mobiscroll, a to zgłoszenie błędu jest otwarte od ponad roku: code.google.com/p/mobiscroll/issues/ ...
Parker Ault
Gdzie jest wsparcie dla Windows Phone? Zobacz post: blog.mobiscroll.com/where-is-the-windows-phone-support
Levi Kovacs
3

Moja odpowiedź jest zbyt uproszczona. Jeśli lubisz pisać prosty kod działający na wielu platformach, użyj metody window.prompt , aby zapytać użytkownika o datę. Oczywiście musisz sprawdzić poprawność za pomocą wyrażenia regularnego, a następnie utworzyć obiekt daty.

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

W tobie HTML:

<input type="text" onclick="onInputClick(this)" value="2014-01-01">
oabarca
źródło
Miły. Ale zobacz także Wykrywanie wystąpienia „nieprawidłowej daty” Date w JavaScript . (Możesz spróbować ulepszyć wyrażenie regularne, np. Nie akceptować miesięcy> 12, ale maksymalny dzień byłby nadal trudny.)
Arjan,
1

Możesz użyć modułu UI Trigger.io, aby użyć natywnego selektora daty / czasu Androida ze zwykłym wejściem HTML5. Jednak wymaga to użycia ogólnej struktury (więc nie będzie działać jak zwykła mobilna strona internetowa).

Możesz zobaczyć zrzuty ekranu przed i po w tym poście na blogu: selektor daty i godziny

Amir Nathoo
źródło
0

W HTML:

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

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

Mauro
źródło
-6

W elementach formularza użyj input type="time". Zaoszczędzi ci to kłopotów związanych z używaniem biblioteki selektora danych.

Jeff K.
źródło