input[type='number'],ios安卓采坑记

input[type='number'],ios安卓采坑记
最新回答
顾清颜

2023-09-26 14:09:55

input[type='number']在iOS和安卓上的差异及解决方案

在为公司维护移动端H5代码的过程中,由于平台实现的差异,在处理input[type='number']时遇到了不少问题。以下是对这些问题的详细分析以及解决方案。

一、问题描述
  1. iOS端问题

    输入框获取焦点时弹出的数字键盘没有小数点,无法输入小数。

    改为type='number'后,虽然可以输入小数,但也可以输入汉字(键盘上方留存的历史信息)。

    输入连续的小数点后,输入框的值变为空,但显示的值不为空。

  2. 安卓端问题

    可以输入多个小数点。

二、问题分析
  1. iOS端

    初始type='tel'导致无法输入小数。

    改为type='number'后,虽然键盘支持小数,但键盘上方可能留存历史信息导致输入汉字。

    输入连续小数点时,由于输入的值不是合法的浮点数(NaN或Infinity),输入框的值将变为空。

  2. 安卓端

    type='number'的默认行为允许输入多个小数点,但通常会被后续处理(如正则验证)剔除。

三、解决方案方案一:自定义键盘

优点

  • 不存在平台兼容问题。
  • 可控性高,不受原生输入框限制。

缺点

  • 模拟的输入框没有光标,不能实现在值的中间修改(虽然可以模拟,但实现复杂)。

实现方式

  • 使用HTML、CSS和JavaScript自己实现一个数字键盘。
  • 监听键盘的点击事件,将输入的值插入到模拟的输入框中。
方案二:利用input和textInput事件

优点

  • 平台兼容性好。
  • 可以实时获取用户输入的值。

缺点

  • 暂未发现明显缺点。

实现方式

  • 监听input或textInput事件。
  • 使用事件对象中的data属性获取当前键入的字符。
  • 根据需要处理输入的值(如剔除非法字符)。
方案三:修改键盘类型(原生开发支持)

优点

  • 快捷简单,可以保持现有代码较小的改动。

缺点

  • 需要原生开发的小伙伴支持。

实现方式

  • 在iOS端,将input的type设置为tel,并通过原生代码设置keyboardType为UIKeyboardTypeDecimalPad。
  • 这样弹出的键盘将带有小数点,满足输入小数的需求。
四、总结

在处理input[type='number']时,由于iOS和安卓的差异,可能会遇到各种问题。通过自定义键盘、利用input和textInput事件以及修改键盘类型(原生开发支持)等方案,可以有效地解决这些问题。在实际开发中,应根据具体需求和项目情况选择合适的方案。同时,也需要注意跨平台兼容性,确保在不同平台上都能获得良好的用户体验。

最后,开发过程中遇到问题时,不要急于求成,要耐心分析问题的原因,并寻找合适的解决方案。同时,也要保持对新技术和新方法的关注,以便在遇到问题时能够有更多的选择。