Вызов встроенного средства выбора даты из веб-приложения на iOS / Android

79

Я пытаюсь изучить возможности запуска собственного веб-приложения на разных платформах с использованием HTML5. В настоящее время <input type="date">поле просто открывает стандартную программную клавиатуру на Android и iOS. Я полагаю, что в будущем программные клавиатуры мобильной ОС будут включать в себя средства <select>выбора даты и тому подобное - точно так же, как сегодня вызывает собственный выбор.

Поскольку это не реализовано ни на Android, ни на iOS, но реализовано в собственном пользовательском интерфейсе, возможно ли для веб-приложения вызывать собственное средство выбора даты, то есть при нажатии?

Это позволило бы нам отказаться от использования библиотек JavaScript, таких как jQuery mobile и YUI.

Если мой вопрос каким-то образом непонятен, скажите, пожалуйста. Заранее спасибо :-)

Hnilsen
источник
См. Также stackoverflow.com/questions/388814/…
Даниэль Треббиен
Я обнаружил, что самым простым способом было бы использовать, input[type=text]а затем ng-clickоткрывать родное средство выбора даты с помощью javascript.
Сиддхарт,
1
@Siddharth Это достойное предложение ... по какой-то причине на Android 7 input type = date вызывает совершенно другое средство выбора, чем встроенное средство выбора даты (например, вы не можете прокручивать его пальцем). Кстати, а как вообще "родной" выбор даты в javascript открыть?
Майкл

Ответы:

105

Некоторые устройства уже несколько лет поддерживают, <input type="date">а другие нет, поэтому нужно быть осторожным. Вот некоторые наблюдения 2012 года, которые могут быть актуальны и сегодня:

  • Можно определить, type="date"поддерживается ли, установив этот атрибут, а затем прочитав его значение. Браузеры / устройства, которые его не поддерживают, игнорируют установку типа dateи возвращаются textпри считывании этого атрибута. В качестве альтернативы для обнаружения можно использовать Modernizr . Помните, что недостаточно проверить версию Android; например, Samsung Galaxy S2 на Android 4.0.3 поддерживает type="date", но Google / Samsung Nexus S на более поздней версии Android 4.0.4 - нет .

  • При предварительной установке даты для встроенного средства выбора даты обязательно используйте формат, который распознает устройство. Если этого не сделать, устройства могут молча отклонить его, оставив поле с пустым полем ввода при попытке показать существующее значение. Как с помощью выбора даты на Galaxy S2 работает Android 4.0.3 мощь сама установить <input>на 2012-6-1на 1 июня. Однако, при установке значения из JavaScript, она нуждается в ведущие нули: 2012-06-01.

  • При использовании таких вещей, как Cordova (PhoneGap) для отображения встроенного средства выбора даты на устройствах, которые не поддерживают type="date":

    • Обязательно правильно определите встроенную поддержку. Как и в 2012 году на Galaxy S2 работает Android 4.0.3, ошибочно также с помощью плагина Cordova Android приведет показывая выбора даты дважды подряд: раз после нажатия кнопки «набор» в своем первом появлении.

    • Когда на одной странице есть несколько входов, некоторые устройства показывают «предыдущий» и «следующий», чтобы перейти в другое поле формы. В iOS 4 это не запускает onclickобработчик и, следовательно, дает пользователю обычный ввод. Использование onfocusдля запуска плагина, похоже, работает лучше.

    • В iOS 4 при использовании onclickили onfocusдля запуска плагина 2012 iOS сначала показывалась обычная клавиатура, после чего поверх нее помещалось средство выбора даты. Далее, после использования выбора даты, все равно нужно было закрыть обычную клавиатуру. Использование $(this).blur()для удаления фокуса до отображения выбора даты помогло для iOS 4 и не повлияло на другие устройства, которые я тестировал. Но он представил быстрое мигание клавиатуры на iOS, и при первом использовании все могло быть еще более запутанным, поскольку тогда средство выбора даты было медленнее. Можно полностью отключить обычную клавиатуру, сделав ввод, readonlyесли использовался плагин, но это отключило кнопки «предыдущий» и «следующий» при вводе других вводов на том же экране. Также кажется, что плагин iOS 4 не заставлял "отменить" родное средство выбора даты.

    • На iPad с iOS 4 (симулятор) в 2012 году казалось, что плагин Cordova некорректно отображался, в основном не давая пользователю возможности ввести или изменить дату. (Возможно, iOS 4 не отображает свое родное средство выбора даты хорошо поверх веб-представления, или, может быть, стили CSS моего веб-представления имеют некоторый эффект, и, конечно же, на реальном устройстве все может быть иначе: прокомментируйте или отредактируйте!)

    • Хотя в 2012 году плагин выбора даты Android пытался использовать тот же JavaScript API, что и плагин iOS, и использовался его пример allowOldDates, версия Android фактически не поддерживала это. Кроме того, он вернул новую дату, как 2012/7/2и в версии для iOS Mon Jul 02 2012 00:00:00 GMT+0200 (CEST).

  • Даже когда <input type="date">поддерживается, все может выглядеть запутанным:

    • iOS 5 прекрасно отображается 2012-06-01в локализованном формате, например, 1 Jun. 2012или June 1, 2012(и даже обновляет его сразу же, пока работает средство выбора даты). Однако Galaxy S2 под управлением Android 4.0.3 показывает некрасивый 2012-6-1или 2012-06-01, независимо от того, какой языковой стандарт используется.

    • iOS 5 на iPad (симулятор) не скрывает клавиатуру, если она уже видна при касании ввода даты или при использовании «предыдущий» или «следующий» в другом вводе. Затем он одновременно показывает выбор даты под полем ввода и клавиатуру внизу, и, кажется, разрешает любой ввод с обоих. Однако, хотя это и меняет видимое значение, ввод с клавиатуры фактически игнорируется. (Отображается при считывании значения или при повторном вызове средства выбора даты.) Если клавиатура еще не была отображена, при прикосновении к вводу даты отображается только средство выбора даты, но не клавиатура. (На реальном устройстве все может быть иначе, прокомментируйте или отредактируйте!)

    • Устройства могут отображать курсор в поле ввода, а долгое нажатие может вызывать параметры буфера обмена, возможно, показывая и обычную клавиатуру. При нажатии некоторые устройства могут даже отображать обычную клавиатуру на долю секунды, прежде чем измениться, чтобы отобразить средство выбора даты.

Арджан
источник
Можете ли вы подтвердить, что плагин действительно запускает собственный элемент управления (в отличие от рендеринга JS-эмуляции собственного элемента управления)?
Д.А.
Ну, исходный вопрос заключается в том, чтобы сделать это в самом веб-браузере. Ваш ответ относится к территории PhoneGap, хотя, похоже, «подводные камни» подразумевали, что, возможно, PhoneGap не запускал собственный элемент управления, а скорее использовал JavaScript для имитации собственного элемента управления. Но, если я понимаю ваш ответ, подключаемый модуль PhoneGap действительно запускает встроенное средство выбора даты ОС устройства за пределами мобильного сафари.
Д.А.
Я все еще немного не понимаю, что запускает плагин PhoneGap. Например, вы заявляете, что у iPad есть проблемы с рендерингом. Почему он неправильно отображает собственный элемент управления? (Я отвечу и на свои старые вопросы ...)
DA.
Почему iPad (симулятор) не может показать собственное средство выбора даты при запуске из плагина, я, к сожалению, не знаю. Может быть, что-то в коде Objective C плагина не так, или, может быть, показывать средство выбора даты поверх веб-представления проблематично, или, может быть, даже стиль CSS веб-страницы, который я использую, каким-то образом влияет на это (хотя он не должен ). Но все дело в родных средствах выбора даты; заглянуть в Яву , она совсем маленькая.
Arjan
1
Предостережение: в iOS событие onchange срабатывает, когда вы меняете только один из трех элементов управления для дня / месяца / года. Это преждевременно, так как пользователь может изменить несколько, а затем нажать «Готово», чтобы подтвердить новую дату. Вместо этого мне пришлось использовать событие onblur.
EoghanM
14

iOS 5 теперь лучше поддерживает HTML5. в вашем веб-приложении сделайте

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

В Android 4.0 отсутствует поддержка этого типа встроенного меню.

Бот
источник
3
Ваш ответ так же верен, как и ответ Эйрика Хоэма. Android 4.0 до сих пор не поддерживает, это катастрофа. Позор тебе, Google!
hnilsen
В настоящее время Android 4.0.3 на Samsung Galaxy S2 поддерживает это, а 4.0.4 на Nexus S нет, @hnilsen.
Arjan
Э, нет: я не говорю, что Android 4.0.3 поддерживает его, но: Android 4.0.3 на Galaxy S2 поддерживает ...
Арджан,
Я использую это для Android в ионном приложении. Он работает нормально, но я делаю этот ввод как скрытый и запускаю событие щелчка, когда пользователь нажимает на div, поэтому он не работает. Есть идеи?
Джей Шукла
5

iOS5 поддерживает это ( Ссылка ). Если вы хотите вызвать собственное средство выбора даты, у вас может быть опция с PhoneGap (я не тестировал это).

Эйрик Хоэм
источник
1
Вы можете использовать собственный pickerView с PhoneGap / Cordova со следующим плагином: github.com/mgcrea/cordova-pickerview
Olivier
5

Дайте Mobiscroll попробовать. Выбор даты и времени в стиле скроллера был специально создан для взаимодействия на сенсорных устройствах. Он довольно гибкий и легко настраиваемый. Поставляется с темами iOS / Android.

Леви Ковач
источник
2
Хм, это в основном противоположность тому, что я бы использовал. Это не быстро, его нелегко поддерживать и он не похож ни на что, кроме iOS, Android по умолчанию и Sense. Тем не менее, спасибо за ваш вклад :-)
hnilsen
Я нахожу mobiscroll очень глючным и ненадежным в собственном браузере HTC Desire. В лучшем случае это кажется медленным, но часто прокрутка заедает, поэтому он просто непрерывно пролистывает даты.
Лео
На iOS работает намного лучше. Однако ... Я использую его в HTC Desire HD, и версия 2.0 кажется улучшенной. И, похоже, он работает даже лучше в других браузерах Android, например, в Dolphin.
Леви Ковач
Имейте в виду, что WP7 не поддерживается mobiscroll, и этот билет об ошибке открыт уже более года: code.google.com/p/mobiscroll/issues/…
Parker Ault
Где поддержка Windows Phone? См. Сообщение: blog.mobiscroll.com/where-is-the-windows-phone-support
Леви Ковач,
3

Мой ответ слишком упрощен. Если вам нравится писать простой код, который работает на разных платформах, используйте метод window.prompt, чтобы спросить у пользователя дату. Очевидно, вам нужно выполнить проверку с помощью регулярного выражения, а затем создать объект даты.

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

В вашем HTML:

<input type="text" onclick="onInputClick(this)" value="2014-01-01">
Oabarca
источник
Ницца. Но см. Также Определение экземпляра Date «недопустимой даты» в JavaScript . (Вы можете попытаться сделать регулярное выражение немного лучше, например, не принимать месяцев> 12, но максимальный день все равно будет трудным.)
Арджан
1

Вы можете использовать модуль пользовательского интерфейса Trigger.io для использования встроенного средства выбора даты и времени Android с обычным вводом HTML5. Однако для этого требуется использование общей структуры (поэтому она не будет работать как обычная мобильная веб-страница).

Вы можете увидеть скриншоты до и после в этом сообщении блога: выбор даты и времени

Амир Натху
источник
0

В HTML:

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

В 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

На вашей форме элементы используют input type="time". Это избавит вас от лишних хлопот при попытке использовать библиотеку сборщика данных.

Джефф К.
источник