目标:找到一种跨平台的解决方案,用于在基于触摸的移动设备上显示数字键盘,并且将黑客攻击降至最低。
问题:
我有一个使用数据输入表单的常规 Web 应用程序,主要包含数字数据。当用户在移动设备上与我的网站交互时,我想显示一个数字虚拟键盘,因为大多数标准键盘需要第二次按下才能从字母切换到数字。我知道我可以通过设置输入元素的“类型”属性来触发不同的键盘:
type=number
:这在 iOS/Safari 下效果很好。我不确定平台上的其他浏览器。
在 Android 上,这不会在各种浏览器上始终提升正确的键盘,并且通常会导致输入时出现不需要的电梯按钮。我还没有找到一种干净的方法来在 CSS 中关闭这些。
type=tel
:这几乎适用于 iOS/Safari,但电话键盘缺少十进制按钮。
似乎在多个 android 浏览器上都能很好地工作,而页面中没有添加任何无关的 UI 元素。
我目前的解决方案是hacky和简单化。基于我已经用于数字验证的类,我将每个应该包含数字的文本元素替换为基于检测到的操作系统/浏览器的anumber
或类型的新输入。tel
var isAndroid = navigator.userAgent.match(/android/i) ? true : false;
var isIOS = navigator.userAgent.match(/(ipod|ipad|iphone)/i) ? true : false;
if (isAndroid || isIOS) {
var useNumberType = (isIOS ? true : false); //iOS uses type=number, everyone else uses type=tel
jQuery("input.num").each(function () {
var type = (useNumberType ? "number" : "tel");
var html = this.outerHTML;
html = html.replace(/(type=\"?)text(\"?)/, "$1" + type + "$2");
this.outerHTML = html;
});
}
我宁愿不使用浏览器检测,也不希望在运行时动态更改输入。我可能会在服务器端引入一个 http 模块,它基本上做同样的事情,但实际上并没有更好。对此没有 CSS 调用,我感到很震惊。
有没有更好的方法来获得带有小数点按钮的数字键盘,它适用于所有或大多数基于触摸的移动设备,而无需向页面添加奇怪的 UI 元素?
- - - - - - - 更新
我不认为有一种方法可以做我真正想做的事情,即设置一个可以在桌面浏览器和所有主要的基于移动触摸的平台上正常工作的单一输入样式或类型。我决定通过直接 DOM 调用而不是通过 jQuery 来更改输入的类型,而不是通过 outerHTML 重写整个输入。我怀疑效果上没有太大区别,但代码更简洁一些。由于我没有更改桌面上的输入类型,因此我不必担心 IE 对属性的只读限制。
理想情况下,我可能会在服务器端处理此问题,以便以发出请求的设备所需的格式将所有内容发送到浏览器。但现在新代码看起来更像这样:
var isAndroid = navigator.userAgent.match(/android/i) || navigator.platform.match(/android/i) ? true : false;
var isIOS = navigator.userAgent.match(/(ipod|ipad|iphone)/i) ? true : false;
if (isAndroid || isIOS) {
var useNumberType = (isIOS ? true : false); //iOS uses type=number, everyone else uses type=tel
jQuery("input.num").each(function () {
var type = (useNumberType ? "number" : "tel");
if (this.type == "text") {
this.type = type;
}
});
}