这些对象由输入辅助行为创建,因此不适用于公共用途,即,您无法构造这些对象并进行使用。
以下描述概括了在日期时间辅助适用于包含日期时间字符串的输入字段时,如何处理击键、鼠标和剪贴板交互。
当该字段获得焦点时,值将变换为“输入格式”,随后被强制转换为正确的值并使用提示字符替换前导零,完成上述操作后,会显示结果并且将光标定位在第一个输入位置的前面。
日期时间的“输入格式”根据日期时间的格式而构造。所有不是 y、G、M、d、h、H 或 m 的日期组件或者所有已从格式中除去的日期组件,以及所有“文本”组件(使用三个或三个以上字母的组件)都将转换为数字组件,例如,MMMM 变成 MM。所有单字符组件都将转换为双字符组件,例如,d 变成 dd。年份组件将变换为 yyyy 或 yy。纪元将转换为字面值,如果是圣日历、希伯来日历和佛教日历,则该纪元不能更改,或者进行转换以允许输入前导字符,如果是基督日历和日本格里高利日历,则可以实现此操作。结果是一种仅包含“数字组件”的输入格式,这些组件唯一确定日期值,纪元除外,如果纪元存在,则它是单字符。值将转换为输入格式,并且如果值不是 NULL,则将强制转换为正确的值。强制转换会将任何不正确的组件替换为根据范围而调整的“今天的日期”中相应的组件。例如,如果月份是“14”,当前是 9 月,则月份将更改为“09”。如果月份是“02”,日期是“31”,今天是 9 月 30 日,则此日期将更改为 28(或 29),即,日期将更改为“30”,但由于 2 月没有 30 天,所以这里的 30 随后将限定为 28(或 29)。
例如,如果日期时间格式为 EEEE MMMM dd,yyyy,则输入格式为“MM dd,yyyy”。如果值是 September 31, 2003,则它将转换为输入格式(09/31/2003),然后在经过强制转换后,显示结果“*9 30, 2003”。
当该字段失去焦点时,将从该字段中除去提示字符,值将强制转换为正确的值,因此在 onblur 之后,此值始终是“正确的”,然后,将使用值的原始格式对其重新进行格式化。onBlur 中的“强制转换”与 onfocus 中的强制转换相同。注意,只是从该字段中“除去”提示字符而不会将其替换为 0,因此,如果该提示字符是 * 且组件保留为“19**”,则该组件的值是“19”而不是“1900”。
当按下数字键,即,生成 keypress 事件时,如果光标定位在输入位置之前,则生成的日期组件将进行范围检查,并且如果结果有效,则光标位置处的字符或提示字符将被覆盖,否则,所选项中的第一个字符将被覆盖,并且所选项中的剩余字符将设置为提示字符。例如,如果光标在月份组件“*3”中 * 字符的前面,并且用户按下 1,则结果将无效,组件的值不能是 13,但如果输入了 0,则此组件有效(03 是有效的月份)并且 0 将覆盖提示字符。然后,光标将前进到用户可以输入的下一位置或者字段的末尾。如果按下了无效的键,则“什么都不会发生”。如果纪元存在且可编辑,并且光标定位在该纪元的第一个字符处,则按下相应的字符(例如,如果是基督字符,则为 A 或 B)将填充所有纪元字符,例如,按下 A 将填充 AD,并且光标将前进到下一可编辑位置。
因为构成有效组件的内容可能依赖于另一组件,所以会出现一些有点复杂的问题。例如,考虑日期 MM/DD/YY 并且用户想要输入 11 30 06。如果初始时日期为空,则用户只需输入 11 30 06。但是,如果日期初始时为 12/31/06,则当用户输入 11 时,值“31”就不再有效,这是因为 11 月份没有 31 天。在组件间存在依赖性时,不是“阻止”用户输入,例如,不允许用户输入“11”,而是“清除”无效的字符。因此,如果用户输入 11,系统将清除 31,但允许输入 11。即使是在日期组件的单个部件中,也会存在这些依赖性。例如,假定月份为“09”。如果用户输入“12”,则由于“19”不是有效的月份,因此在用户输入“1”后,将发生问题。系统将再次清除有问题的字符,而不是阻止输入,因此当用户输入“1”时,2 将被清除掉。在构成日期的两个字符、构成月份的两个字符、每个月中的各天、年份中的各个月份(在希伯来日历中)以及年份(不管年份是闰年,还是希伯来日历中的满月、正月或亏月)中都存在相互依赖性。
当按下控制键,即,使用键控代码中指明的控制键生成了 keydown 事件时,日期时间辅助将处理 keydown 事件上的控制键,这是 Windows® 中的标准。如果控制键是右箭头键,则光标将前进到字符串中可以进行输入的下一位置。如果按下了左箭头键,则光标将立即“向后”移到上一个可以进行输入的位置之后,因此,再次按下左箭头键之前,可能不能进行输入 - 这允许将光标定位在 Backspace 键将起作用的位置。如果按下了 Del 键,则将删除光标位置后面的字符,如果存在所选内容,则删除所选内容,并且光标会前进到下一位置。如果按下了 Backspace 键,则将删除光标位置前面的字符,并且光标会向后移。如果按下了 Tab 或 Enter 键,则将执行正常形式的处理操作。不会对任何其他控制键进行特殊处理,例如,不会对 HOME 和 END 键进行特殊处理,它们会按预期方式进行工作。
如果用户单击字段且并非是要进行选择,则光标将定位在用户可能输入的“下一个”字符之前。
仅 IE 可以处理剪切/复制/粘贴交互,Mozilla 不支持此类交互,而且在 IE 中只提供有限支持。虽然 IE 为管理交互提供了完整的事件集,但 IE 对剪贴板仅具有有限的访问权,因此限制了可以完成的操作。
“复制”将所选内容原样复制到剪贴板。“剪切”完成相同的操作,不过它会清除所选内容,即将所有输入位置设为空。在粘贴时,如果剪贴板上的值似乎为日期时间字符串,则仅粘贴“输入”字符(非字面值)字符,否则将粘贴整个字符串。粘贴会将字符仅应用于“输入”位置而跳过字面值。如果有任何字符未通过输入验证,则将取消整个粘贴,否则光标将被放在所粘贴字符的末尾,虽然有时浏览器随后会移动光标位置。