从 iOS/Android 上的网络应用程序调用本机日期选择器

IT技术 javascript iphone android ios html
2021-02-28 00:07:27

我正在尝试探索使用 HTML5 在不同平台上运行本机 Web 应用程序的可能性。目前,一个<input type="date">字段只打开 Android 和 iOS 上的标准软键盘。我想在未来移动操作系统的软键盘将包括日期选择器等 - 就像<select>今天调用本机选择一样。

由于这不是在 Android 或 iOS 上实现的,而是在本机 UI 中实现的,网络应用程序是否有可能调用本机日期选择器,即点击时?

这将使我们可以停止使用 jQuery mobile 和 YUI 等 JavaScript 库。

如果我的问题有任何不清楚的地方,请告诉我。先感谢您 :-)

6个回答

由于有些设备支持<input type="date">有些设备不支持,因此需要小心。以下是 2012 年的一些观察结果,今天可能仍然有效:

  • 可以type="date"通过设置该属性然后读回其值来检测是否支持。不支持它的浏览器/设备将忽略将类型设置为datetext在读回该属性时返回。或者,Modernizr可用于检测。请注意,仅检查某些 Android 版本是不够的;像三星Galaxy S2在Android 4.0.3不支持type="date",但谷歌/三星Nexus S在最近的Android 4.0.4确实没有

  • 为本地日期选择器预设日期时,请务必使用设备可识别的格式。如果不这样做,设备可能会默默地拒绝它,在尝试显示现有值时留下一个空的输入字段。如使用在银河S2日期选取器运行Android 4.0.3本身可能设置<input>2012-6-1了6月1日。但是,当从 JavaScript 设置值时,它需要前导零:2012-06-01

  • 当使用 Cordova (PhoneGap) 之类的东西在不支持的设备上显示本机日期选择器时type="date"

    • 请务必正确检测内置支持。就像在2012年银河S2运行的是Android 4.0.3,错误地用cordovaAndroid插件会导致显示的日期选择器连续两次:一次单击它第一次出现的“设置”后。

    • 当同一页面上有多个输入时,某些设备会显示“上一个”和“下一个”以进入另一个表单字段。在 iOS 4 上,这不会触发onclick处理程序,因此为用户提供常规输入。使用onfocus触发插件似乎更好地工作。

    • 在 iOS 4 上,使用onclickonfocus触发 2012 iOS 插件首先使常规键盘显示,之后日期选择器被放置在它之上。接下来,使用日期选择器后,仍然需要关闭常规键盘。$(this).blur()在显示日期选择器之前使用移除焦点对 iOS 4 有帮助,并且不会影响我测试的其他设备。但是它在 iOS 上引入了一些快速闪烁的键盘,并且在第一次使用时可能会更加混乱,因为那时日期选择器更慢。readonly如果使用插件,则可以通过进行输入来完全禁用常规键盘,但是在同一屏幕上输入其他输入时,会禁用“上一个”和“下一个”按钮。iOS 4 插件似乎也没有使本机日期选择器显示“取消”

    • 在 iOS 4 iPad(模拟器)上,2012 年 Cordova 插件似乎没有正确渲染,基本上没有给用户任何输入或更改日期的选项。(也许 iOS 4 没有在 web 视图之上很好地呈现其原生日期选择器,或者我的 web 视图的 CSS 样式有一些影响,当然这在真实设备上可能会有所不同:请发表评论或编辑!)

    • 尽管在 2012 年,Android 日期选择器插件再次尝试使用与 iOS 插件相同的 JavaScript API,并且使用allowOldDates它的示例,但 Android 版本实际上并不支持。此外,它返回新日期,2012/7/2而 iOS 版本返回Mon Jul 02 2012 00:00:00 GMT+0200 (CEST).

  • 即使<input type="date">支持,事情也可能看起来很混乱:

    • iOS 52012-06-01以本地化格式很好地显示,例如1 Jun. 2012June 1, 2012(甚至在仍然操作日期选择器的同时立即更新)。但是,无论使用哪种语言环境,运行 Android 4.0.3 的 Galaxy S2 都会显示难看的2012-6-12012-06-01

    • 当触摸日期输​​入或在另一个输入中使用“上一个”或“下一个”时键盘已经可见时,iPad(模拟器)上的 iOS 5 不会隐藏键盘。然后它同时显示输入下方的日期选择器底部的键盘,并且似乎允许来自两者的任何输入。然而,虽然它确实改变了可见值,但实际上忽略了键盘输入。(在读回值时或再次调用日期选择器时显示。)当键盘尚未显示时,触摸日期输​​入仅显示日期选择器,而不显示键盘。(这在真实设备上可能会有所不同,请评论或编辑!)

    • 设备可能会在输入字段中显示光标,长按可能会触发剪贴板选项,也可能会显示常规键盘。单击时,某些设备甚至可能会显示常规键盘一瞬间,然后更改为显示日期选择器。

我仍然对 PhoneGap 插件触发的内容有些困惑。例如,您声明 iPad 存在渲染问题。为什么它会错误地呈现本机控件?(我也会去解决我的旧问题......)
2021-04-17 00:07:27
不幸的是,我不知道为什么 iPad(模拟器)在从插件触发时无法显示自己的原生日期选择器。也许插件 Objective C 代码中的某些内容是错误的,或者可能以某种方式在 Web 视图顶部显示日期选择器很麻烦,或者甚至可能是我使用的网页的 CSS 样式以某种方式影响了它(虽然它不应该)。但一切都与本地日期选择器有关;窥视Java,它很小。
2021-05-03 00:07:27
您能否确认该插件确实触发了本机控件(与渲染本机控件的 JS 仿真相比)?
2021-05-04 00:07:27
警告:在 iOS 上,当您仅更改日/月/年的 3 个控件之一时,将触发 'onchange' 事件。这为时过早,因为用户可能会更改多个,然后点击“完成”以确认新日期。我不得不改用'onblur'事件。
2021-05-06 00:07:27
好吧,最初的问题是关于在 Web 浏览器本身中执行此操作。不过,您的回答涉及 PhoneGap 领域,“陷阱”似乎暗示可能 PhoneGap 没有触发本机控件,而是使用 JavaScript 来模仿本机控件。但是,如果我理解您的回复,PhoneGap 插件确实会触发移动 safari 之外的本地设备操作系统日期选择器。
2021-05-16 00:07:27

iOS 5 现在更好地支持 HTML5。在你的 webapp 中做

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

Android 4.0 缺少这种类型的本机菜单支持。

呃,不:我不是说 Android 4.0.3 支持它,但是:Galaxy S2 上的Android 4.0.3确实......
2021-04-17 00:07:27
我在 ionic 应用程序中将其用于 android。它工作正常,但我将此输入设置为隐藏并在用户单击 div 时触发单击事件,因此它不起作用。任何的想法?
2021-04-19 00:07:27
您的回答与 Eirik Hoem 的回答一样正确。Android 4.0 仍然不支持这是一场灾难。为你感到羞耻,谷歌!
2021-04-22 00:07:27
现在,三星 Galaxy S2 上的 Android 4.0.3 支持这一点,但 Nexus S 上的 4.0.4 不支持,@hnilsen。
2021-04-24 00:07:27

iOS5 对此有支持(参考)。如果你想调用本地日期选择器,你可能有一个 PhoneGap 的选项(我自己没有测试过)。

您可以通过以下插件使用带有 PhoneGap/Cordova 的本机 pickerView:github.com/mgcrea/cordova-pickerview
2021-05-17 00:07:27

Mobiscroll一试。滚动式日期和时间选择器是专为触摸设备上的交互而创建的。它非常灵活,并且易于定制。它带有 iOS/Android 主题。

它在 iOS 上运行得更好。但是...我在 HTC Desire HD 上使用它,2.0 似乎有所改进。它似乎在其他 android 浏览器上运行得更好,例如 Dolphin。
2021-04-21 00:07:27
嗯,这基本上与我使用的相反。它速度不快,维护起来也不容易,而且除了 iOS、默认的 Android 和 Sense 之外,它看起来一点也不像任何东西。谢谢你的贡献,不过:-)
2021-05-03 00:07:27
我发现 HTC Desire 本机浏览器上的 mobiscroll 非常有问题且不可靠。充其量它似乎滞后,但经常滚动棒,所以它只是不断地在日期中呼啸而过。
2021-05-03 00:07:27
Windows Phone 支持在哪里?见帖子:blog.mobiscroll.com/where-is-the-windows-phone-support
2021-05-08 00:07:27
请注意,mobiscroll 不支持 WP7 并且此错误票已开放一年多:code.google.com/p/mobiscroll/issues/...
2021-05-12 00:07:27

我的回答过于简单。如果您喜欢编写跨平台工作的简单代码,那么使用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">
好的。但另请参阅在 JavaScript 中检测“无效日期”日期实例(您可以尝试使正则表达式更好一点,例如不接受月数 > 12,但最大天数仍然很难。)
2021-04-23 00:07:27