HTML5 number类型文本框step属性的验证机制——张鑫旭

我在下一盘很大的棋,本文只是其中的一个棋子。

需要提前知道的:

  1. 目前而言,对step雄起的浏览器为IE10+, Chrome以及Opera浏览器。
  2. 需要预先知道number类型input的一些基本知识。
  3. HTML5 step的验证机制可以应用在不支持的浏览器上。

问题引导,威逼利诱

如下一小段含step属性的HTML代码:

<input type="number" step="2.1" min="1" />

在Chrome浏览器下长相应该是下面这个样子(假设限宽70像素):

下面提问,请问:

对于上面的number框,下面几个数值哪些是有效的?
A. 1.0
B. 2.1
C. 3.1
D. 4.2

我的答案是:

在你大脑这样:

也有可能是这样子:

之后,我们得到了正确的答案:A. 1.0以及C. 3.1

可能有人有疑问?明明step2.1,但是2.1确实无效的数值呢??

keep on~~

实例页面,现身说法

如果您正在使用的是文章一开始提到的“雄起”浏览器,您可以狠狠地点击这里:HTML5 number文本框step验证demo

下为Chrome浏览器下截图:

N个number类型输入框,您可以随意设置值,点击最后的“提交”按钮,内置的HTML验证会判断您输入的数值是否是符合要求的。

例如,与上面的提问对应的输入框是倒数第二个框框,如下示意:

我们依次输入1.02.13.14.2看一下是否会出现提示,结果依次如下截图:
   

但是,同样是step=2.1上面一个框框,输入3.1却是无效的:

为何有此差异呢?

细心的你可能发现了其中的差异,就是min属性作的祟。

min=1的时候,

min + step * 0 = 1 + 2.1 * 0 = 1
min + step * 1 = 1 + 2.1 * 1 = 3.1
min + step * 1 = 1 + 2.1 * 2 = 5.2
.
.
.

于是,1.0以及3.1是有效值,而2.1无效的。

number框没有min的时候,min是无限小,实际验证的时候,min等同于0, 因此:

<input type="number" step="2.1" />

的有效值是:02.14.2.

min + step * 0 = 0 + 2.1 * 0 = 0
min + step * 1 = 0 + 2.1 * 1 = 2.1
min + step * 1 = 0 + 2.1 * 2 = 4.2
.
.
.

maxstep的有效值判断不来电的。

总结概括,小功告成

末日即将来临,没有多少时间扯废话,以下为demo页面测试得出的一些结论:

  1. 输入非数值内容,如字母x,值会被置空缺省处理 - 浏览器当作你没输入过。
  2. 在number输入框的世界里,1.00和1.0和1是没有区别的。
  3. 默认step1,因此,木有step属性值的时候,小数值是无效的(.0除外)。
  4. 输入数值的有效与否与step以及min属性相关,至于max, 是卖切糕的,不搭噶。
  5. 输入值是否有效的计算公式是:

    是否:(输入数值 - min值) ÷ step值 === 整数
  6. 当没有min的时候,我们可以把min等同于0计算处理(实际min是无限小)。
  7. IE10虽然支持number类型输入框,但是在UI表现上,却没有上下增减按钮。而且,其提示效果真是粗糙的令人啧舌!
  8. Opera浏览器不能准确认识step=".1",或者应该是不认识,IE10以及Chrome浏览器可以准确识别为step="0.1", 因此,从兼容角度来讲,还是写成0.1而不是.1
  9. 每个浏览器对值无效时候的提示文字都是不一样的:
    IE10是:“你必须输入有效值”;
    Opera是:此表单不允许数字 **。此输入框值允许特定的数字。
    Chrome是:值无效。

    个人而言,更喜欢Chrome的简洁明了的表述。

欢迎补充,欢迎指出文章表述不准确的地方。

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=2817

(本篇完)

时间: 2024-11-14 20:02:15

HTML5 number类型文本框step属性的验证机制——张鑫旭的相关文章

[转] HTML5终极备忘大全(图片版+文字版)----张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1544 一.前言兼图片备忘 下图是我从testking网站上的Ultimate HTML5 Cheatsheat这篇文章中备忘图片(已大小优化,因为图片较高,故滚动显示). 但是,上面毕竟是图片格式(原图上兆),而且还是英文的,所以自己觉得有必要将上面的内容文字化,同时做下简单的中文翻译.整理一番,于是就有下面的些内容.

HTML5新增的form属性简介——张鑫旭

一.引言 HTML5中新增了一个名为form的属性,是一个与处理表单相关的元素. 在HTML4或XHTML中,我们要提交一个表单,必须把相关的控件元素都放在<form>元素下.因为表单提交的时候,会直接忽略不是其子元素的控件.但是,实际情况下,由于页面设计与实现的特殊性,会存在有些表单之外的元素也需要一并提交的情况,这时候,传统的表单功能就显得有些捉襟见肘了. HTML5中新增form属性就是为更好地处理这个问题才出现的.其作用,个人感觉,有点类似于label标签的for属性. 二.更好的实现

HTML5扩展之微数据与丰富网页摘要——张鑫旭

一.微数据是? 一个页面的内容,例如人物.事件或评论不仅要给用户看,还要让机器可识别.而目前机器智能程度有限,要让其知会特定内容含义,我们需要使用规定的标签.属性名以及特定用法等.举个简单例子,我们使用<h1>标签包裹页面标题信息就是为了让机器识别(搜索引擎 – SEO). 而微数据是什么呢?在我看来,微数据也是为了方便机器识别而产生的东西.其有特定的规范,有特定的格式.可以丰富搜索引擎的网页摘要. 先来看看比较官方的解释:HTML5 微数据规范是一种标记内容以描述特定类型的信息,例如评论.人

说说HTML5中label标签的可访问性问题——张鑫旭

一.开篇叨叨 一般稍微有些经验的页面制作人员都知道label标签可以优雅地扩大表单控件元素的点击区域,例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高页面的可用性可访问性是很有帮助的. 我们看看点评网的注册页面那个同意条款的复选框,非要点在复选框上才能选中: 查看HTML发现复选框id和label标签的for属性值都是空,不解~~ 像其他网站的登录或是注册处的控件的点击区域就做得蛮不错的,像是豆瓣网, 新浪微博等:  我们一般有两种方法来优雅地扩

HTML5 DOM元素类名相关操作API classList简介(转载自张鑫旭大神)

一.其实事情的发展就像切水果 如果我们把元素的类名操作比作“切水果”游戏的话,其中一个单独的类名就好比“水果”或“炸弹”! DOM Level 2时代,类名的获取与设置,多半使用className属性,className的生效近似切水果的“一刀切”.在web的初期,交互什么的其实很简单的来:就像切水果刚开始的时候,一次就一个水果飞上来,一刀“咔嚓”切了就好,就像使用className赋个类名值,就算偶尔冒出2个水果,className也可以一刀切搞定的. 但是,随着web的发展,交互的逐渐复杂,

使用CSS3改变文本选中的默认颜色——张鑫旭

关于浏览器文字选中颜色 以我的系统举例(xp 默认主题),浏览器上页面文字选中后默认的背景色是一种蓝色, 不同浏览器的颜色有些许差异,但大致相同,文字颜色也近乎白色,如下图所示,截自Firefox3.6浏览器: 在CSS3的爸爸妈妈还没有相亲认识的时候,要改变页面上文字选中后的背景色以及文字颜色,就跟让太监生孩子一样困难.但是,随着CSS3呱呱落地,获得越来越多的浏览器认可,一切又显得那么自然而然.虽然有些顽固的糟老头(如IE浏览器)还不认可这个新生的CSS3,但是,丝毫不影响其在其他浏览器上对

关于拜读张鑫旭文章,了解的新属性

昨天有幸拜读到张鑫旭写的就关于知乎10个问题的一篇文章(http://www.zhangxinxu.com/wordpress/2017/06/ten-question-about-frontend-zhihu/),感受颇深,也深深感受到自己的无知, 张大神主要致力于研究css和html,现在就总结2个张大神在文章中提到的两点: 1.unicode-bidi: 当看到这个属性的时候,真的是一脸懵,自己之前完全没有看到过,所以现在就了解一下,查unicode-bidi时就看到了关于directio

不使用JavaScript让IE浏览器支持HTML5元素——张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2515 如果我们不做什么手脚的话,IE6~IE8浏览器不支持HTML5元素, <nav>, <header>, <footer>, <article> … 然而,前篇Google前端规范HTML部分中提到:要使用语义的HTML5元素作为text/html, 考虑到Google不可能把

JS文本框不能输入空格验证方法

1.只是不能输入空格 复制代码代码如下: <input type="text" onkeyup="this.value=this.value.replace(/^ +| +$/g,'')"> 2.不能输入空格及英文状态下的逗号 复制代码代码如下: <input type="text" onkeyup="this.value=this.value.replace(/[, ]/g,'')"> 3. 复制代码