前言

 最近在用Polymer封装纯数字的输入框,开发过程中发现不少坑,也有很多值得研究的地方。本系列打算分4篇来叙述这段可歌可泣的踩坑经历:

  1. 《动手写个数字输入框1:input[type=number]的遗憾》
  2. 《动手写个数字输入框2:起手式——拦截非法字符》
  3. 《动手写个数字输入框3:痛点——输入法是个魔鬼》
  4. 《动手写个数字输入框4:魔鬼在细节——打磨光标位置》

HTML5带来的福利-input[type=number]

<input
id="age" name="age"
type="number" step="1" min="0" max="120">
<input
id="inc"
type="button" value="增加">
<input
id="dec"
type="button" value="减少"> <script>
/* 工具函数...无视我吧:D */
const comp =
(...fns) =>
(...args) => {
let len = fns.length
while (len--){
args = [fns[len].apply(null, args)]
}
return args.length > 1 ? args : args[0]
}
const isSome = x => 'undefined' !== typeof x && x !== null
const invokerImpl =
n =>
o =>
m =>
(...args) => {
let args4m = args.splice(0, n)
, times = parseInt(args[0]) || 1
, ret = []
while (times--){
ret.push(o[m].apply(o, args4m))
}
return ret.length > 1 ? ret : ret[0]
}
const curry2Partial =
fn =>
(...args) => {
let c = true
, i = 0
, l = args.length
, f = fn
for (;c && i < l; ++i){
c = isSome(args[i])
if (c){
f = f(args[i])
}
}
return f
}
const invoker = curry2Partial(invokerImpl)
const invoker0 = invoker(0)
const $ = invoker(1, document, "querySelectorAll")
const invoker0AtEl = comp(invoker0, $) /* 继续无视我吧:D */
const invoker0AtAge = invoker0AtEl('#age') // input[type=number]提供stepUp和stepDown两个方法来增加和减少数字
const incAge = invoker0AtAge('stepUp')
, decAge = invoker0AtAge('stepDown')
$('#inc').addEventListener('click', incAge)
$('#dec').addEventListener('click', decAge)
</script>

input[type=number]为我们提供了如下特性:

  1. 限制只能输入[+-0-9.]这几个字符
  2. 输入法(IME)也无法输入非[+-0-9.]的字符
  3. 自动的表单验证
  4. minmax来限制数值的下限和上限;
  5. 提供stepUp和stepDown两个方法实现以编程方式控制数值的增加和减少;
  6. 移动设备上当它获得焦点时,会出现数字键盘;
  7. step设置点击右侧微调按钮的步长(默认为1),可设置为小数、整数或anystep的值除了影响微调按钮的步长外,还影响表单验证信息。
<!-- step为整数时 -->
<input name="age1" type="number"
step="1" value="1">
<input name="age1" type="number"
step="1" value="1.1"> <!-- step为小数时 -->
<input name="age2" type="number"
step="0.1" value="1">
<input name="age2" type="number"
step="0.1" value="1.1">
<input name="age2" type="number"
step="0.1" value="1.11"> <!-- step为any时 -->
<input name="age3" type="number"
step="any" value="1">
<input name="age3" type="number"
step="any" value="1.1">
<input name="age3" type="number"
step="any" value="1.11"> <script>
// 显示 true false
$('[name=age1]').forEach(el => console.log(el.validity.valid))
// 显示 true true false
$('[name=age2]').forEach(el => console.log(el.validity.valid))
// 显示 true true true
$('[name=age3]').forEach(el => console.log(el.validity.valid))
</script>

另外,设置为any是让表单验证不受精度限制而已,实际上步长依然为1。

遗憾了我的哥

 到这里我想大家都会发现怎么少了个精度设置呢?确实,input[type=number]并没有为我们提供设置精度的属性或方法。但遗憾的何止是这个呢?

  1. 木有精度精度设置;
  2. 不想要右侧的微调按钮还不行了...
  3. 点击微调按钮和调用stepUpstepDown设置数值确实被限制在minmax区间,但直接输入却不受限制...
  4. 可以输入多个小数点,如2012.12.12;
  5. 设置step=any后,chrome on android的数字键盘居然没了小数点按键。
  6. 设置step=any后,点击微调按钮步长为1,但调用stepUpstepDown则报
Uncaught DOMException: Failed to execute 'stepUp' on 'HTMLInputElement': This form element does not have an allowed value step.

隐藏右侧微调按钮不完全解决方法

Webkit和Gecko下可通过以下的CSS来隐藏右侧微调按钮

/* chrome */
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button{
-webkit-appearance: none!important;
margin: 0;
}
/* Firefox */
input[type=number]{
-moz-appearance: textfield;
}

IE就没辙了:-(

总结

 也许你会问既然HTML5愿意为我们新增一个全新的input[type=number],为什么偏偏提供一个缺胳膊少腿的呢?只能说得哥情时失嫂意,既然它不满足,那就自己写写看咯:)

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/6918305.html _肥仔John

动手写个数字输入框1:input[type=number]的遗憾的更多相关文章

  1. 【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)

    在Vue中的项目,基于VUX-UI开发,一个常见的需求: 1.金额输入框 2.弹出数字键盘 3.仅支持输入两位小数,限制最大11位数,不允许0开头 后续:与UI沟通后, 思路调整为限制输入,并减少正则 ...

  2. input type = number 去除上下箭头,禁用滚轮事件(默认的自带滚轮加减数字)

    <style type="text/css"> /*盒子大小从边框开始计算*/ html * { box-sizing: border-box; } /*解决模态框抖动 ...

  3. input[type=number]问题

    有时候对于只能输入数字的表单会有想要写成input[type=number]但是其中有一个问题 <input type="text" name="code" ...

  4. 限制input[type=number]的输入位数策略整理

    当我们使用类型number的input输入框的时候,我们可能需要限制输入的位数,这个时候通常会想到maxlength,但是maxlength是在number类型的时候是不支持的,下面是一些解决这种问题 ...

  5. 兼容IE7、IE8、IE9的input type="number"插件

    IE11版本好像才兼容input type="number",但是现在Win7版本操作系统下,很多人的IE版本都是IE7/8/9,所以为了体验就自己写了一个小插件,支持设置最大值. ...

  6. input type=number 禁止输入字符“e”的办法

    输入框input,的type设置为number,本想只输入数字,但是字符“e”却能通过, 首先科普一下, <body> <input onkeypress="getCode ...

  7. 加减号改变input[type=number]的数值,基于[zepto.js]

    通过点击加减号可以更改input的数值,样式如下图: 具体的html代码如下: <div class="xh-lxx-cart-count1"> <span cl ...

  8. 输入类型<input type="number"> / input标签的输入限制

    输入限制 属性 描述 disabled 规定输入字段应该被禁用. max 规定输入字段的最大值. maxlength 规定输入字段的最大字符数. min 规定输入字段的最小值. pattern 规定通 ...

  9. 解决 html5 input type='number' 类型可以输入e

    当给 input 设置类型为 number 时,比如,我想限制,只能输入 0-9 的正整数,正则表达式如下: /^[-]?$/ // 匹配 0-9 的整数且只匹配 0 次或 1 次 用正则测试,小数点 ...

随机推荐

  1. 事件驱动的Python实现

    EventManager事件管理类实现,大概就百来行代码左右.如果有不了事件驱动的工作原理的可以看前一篇<事件驱动的简明讲解> # encoding: UTF-8 # 系统模块 from ...

  2. 【shell编程基础2】shell组合应用之一:重定向和逻辑

    这篇主要讲下 数据的重定向,在shell脚本中有些重要的输出重定向为文件的形式输出来 逻辑方式的多个命令组合,可以很方便的进行一些判断 数据流重定向 数据流重定向:大致上的意思就是本该输出到屏幕上的数 ...

  3. Javascript数组与基本函数

    数组定义方法: 1. var arr=new Array(); var arr=Array(); 2. var arr1=Array('a','b','c'); 3. var arr2=['a','b ...

  4. ajax的介绍

    $.ajax({ 11 url: "article.asmx/GetArticleByID", 12 type: "POST", 13 datatype: &q ...

  5. 进程间通信系列 之 socket套接字及其实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  6. mysql 关联查询 索引不起作用原因记录

    业务逻辑如下:查询某篇文章的评论列表,且列出评论人及被评论人的昵称.头像. 先看一下表结构 评论表: 评论表的索引: 用户表: 用户表的索引: 查询语句如下: SELECT t1.comment_id ...

  7. ASP.NET Cookie和Session

    Cookie和Session C#在服务器,JS在客户端 客户端验证不能代替服务端验证 Http HTTP属于应用层,HTTP 协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4 ...

  8. python2与python3的不兼容_urllib2

    网页下载器:将URL对应的网页以HTML下载到本地,用于后续分析 常见网页下载器:Python官方基础模块:urllib2 第三方功能包:requests python 3.x中urllib库和uri ...

  9. hadoop高可靠性HA集群

    概述 简单hdfs高可用架构图 在hadoop2.x中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态.Active NameNode对外提供服务,而Standb ...

  10. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 F - Piggy-Bank 【完全背包问题】

    https://vjudge.net/contest/68966#problem/F http://blog.csdn.net/libin56842/article/details/9048173 # ...