我正在尝试使用HTML5在不同平台上运行本机Web应用程序来探索可行性。目前,<input type="date">
field只是在Android和iOS上打开标准软键盘。我想在未来移动操作系统的软键盘将包括日期选择器等 - 正如<select>
今天调用原生选择。
由于这不是在Android或iOS上实现,而是在本机UI中实现,因此Web应用程序是否可以调用本机日期选择器,即单击时?
这将使我们可以停止使用jQuery mobile和YUI等JavaScript库。
如果我的问题不清楚,请告诉我。先感谢您 :-)
有些年头有些设备支持<input type="date">
,但有些设备不支持,所以需要小心。以下是2012年的一些观察结果,今天仍然有效:
type="date"
。不支持它的浏览器/设备将忽略将类型设置为date
并在读回该属性时返回text
。或者,Modernizr可用于检测。请注意,检查某些Android版本是不够的;像Android 4.0.3上的三星Galaxy S2确实支持type="date"
,但最近Android 4.0.4上的谷歌/三星Nexus S没有。<input>
设置为2012-6-1
。但是,从JavaScript设置值时,它需要前导零:2012-06-01
。type="date"
的设备上显示本机日期选择器时:
务必正确检测内置支持。就像2012年在运行Android 4.0.3的Galaxy S2上一样,错误地使用Cordova Android插件会导致连续两次显示日期选择器:在第一次出现时单击“set”后再次显示。
当同一页面上有多个输入时,某些设备会显示“previous”和“next”进入另一个表单字段。在iOS 4上,这不会触发onclick
处理程序,因此会为用户提供常规输入。使用onfocus
触发插件似乎更好。
在iOS 4上,使用onclick
或onfocus
触发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 5很好地以本地化格式显示2012-06-01
,如1 Jun. 2012
或June 1, 2012
(甚至在操作日期选择器时立即更新)。然而,运行Android 4.0.3的Galaxy S2显示了丑陋的2012-6-1
或2012-06-01
,无论使用哪种语言环境。
当触摸日期输入时,或者在另一个输入中使用“上一个”或“下一个”时,iPad(模拟器)上的iOS 5不会隐藏键盘。然后它同时显示输入下方的日期选择器和底部的键盘,并且似乎允许来自两者的任何输入。但是,虽然它确实更改了可见值,但实际上忽略了键盘输入。 (在回读值时或在再次调用日期选择器时显示。)当键盘尚未显示时,触摸日期输入仅显示日期选择器,而不是键盘。 (这在真实设备上可能有所不同,请评论或编辑!)
设备可能会在输入字段中显示光标,长按可能会触发剪贴板选项,也可能显示常规键盘。点击时,某些设备甚至可能会在一瞬间显示常规键盘,然后再更改为显示日期选择器。iOS 5现在更好地支持HTML5。在你的webapp做
<input type="date" name="date" />
Android 4.0版本缺少此类本机菜单支持。
iOS5支持这个(Reference)。如果你想调用本机日期选择器,你可能有一个PhoneGap选项(我自己没有测试过)。
试试Mobiscroll吧。滚动条样式的日期和时间选择器专门用于触摸设备上的交互。它非常灵活,可轻松定制。它带有iOS / Android主题。
我的回答过于简单了。如果您想编写跨平台工作的简单代码,请使用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">
您可以使用Trigger.io's UI模块将常规HTML日期/时间选择器与常规HTML5输入一起使用。这样做确实需要使用整体框架(因此不能用作常规移动网页)。
您可以在此博客文章中看到屏幕截图之前和之后:date time picker
在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');
};
在您的表单元素上使用input type="time"
。它将为您节省尝试使用数据选择器库的所有麻烦。