关于表单

1. 关于文件输入控件

使用文件输入控件可以浏览本地网络的一个文件,以上传到网站。比如下面这段代码

<input type="file" name="file">

上传一个文件并没有什么稀奇的,但是有的时候我们希望一次性上传多个文件,比如身份证的正反面图片。这需要借助于 multiple 属性,代码就变成了下面这样。

<input type="file" name="file" multiple>

这种方式的确很方便,而且很简单,但并不是所有浏览器都支持这一功能,我尝试了 Firefox, Chrome, Opera 这三种浏览器,Firefox 目前尚不支持这一功能,至少在我的电脑上是不支持的。

文件输入控件还有一个 accept 属性,理论上可以用来限制上传文件类型。然而,实际上它只是建议性的,并且很可能会被忽略。它接受逗号分隔的 MIME 类型,比如将上传的文件类型限制为图片,就可以将代码写成如下形式。

<input type="file" name="file" accept="image/gif,image/jpeg,image/jpg,image/png" multiple>

很不幸的是,Firefox 仍不支持这个属性,好在 ChromeOpera 已经支持这个属性了。


2. 关于复选框

一个复选框通常是一个方形的盒子,可以打勾或者去掉勾,但是用 JavaScript 可以设置第三种中间状态,这样的复选框外观上既不是勾选也不是未勾选,就像下面这样。

demo01.png

代码实现如下

<input type="checkbox" name="option1" id="option1">
<input type="checkbox" name="option2" id="option2" checked>
<input type="checkbox" name="option3" id="option3">
<script>
    function init() {
        document.getElementById("option3").indeterminate = true;
    }
    window.onload = init;
</script>

3. 关于隐藏输入域

隐藏输入类型用于在表单中增加对用户不可见,但是需要提交的额外数据。举个例子来说,隐藏域有时候用来告知服务器可接受的上传文件的最大容量,下面的例子就是告诉服务器上传文件的大小是 20KB。

<input type="hidden" name="MAX_FILE_SIZE" value="200000">

4. 使用数据列表

大多数输入类型包含一个属性 list, 它和一个新元素 datalist 结合使用。这个元素定义当在表单控件输入数据时可用的一个选项列表。效果像下面这样

demo02.png

代码如下所示

<input type="text" name="salary" placeholder="Enter desired salary" list="salaries">
<datalist id="salaries">
    <option value="1000"></option>
    <option value="4000"></option>
    <option value="8000"></option>
    <option value="12000"></option>
</datalist>

5. 添加菜单结构

可以利用 optgroup 元素来分组类似的 option 元素。得出下面的结果

demo03.png

代码如下

<select name="class">
    <optgroup label="science lesson">
        <option value="physics">Physics</option>
        <option value="chemistry">Chemistry</option>
        <option value="biology">Biology</option>
    </optgroup>

    <optgroup label="liberal lesson">
        <option value="history">History</option>
        <option value="political">Political</option>
        <option value="geography">Geography</option>
    </optgroup>
</select>

6. 显示进度

可以使用 progress 显示某一步骤的进度,有两个属性,一个是 max,用于设置最大值,另一个是 value,表示当前的值。

<p><progress value="1" max="3">1/3</progress></p>

效果如下

demo04.png

对于不支持该元素的浏览器,在元素的标签里加上有意义的文字很重要。因为如果 progress 元素不支持,就可以显示文字。

还有一个看上去和 progress 很像的元素,那就是 meter 元素,这二者有很重要的区别, progress 用于显示步骤的进度,而 meter 用来显示度量,也就是,某个已知范围里的一个特定值。这个元素有六个常用属性,minmax 属性设置范围的两端,而 value 设置当前的度量。还有三个属性用于图解的目的,它们分别是 optimum, low, high,可以将区间划分为区域,optimum 用于设置最适宜的区域,下面看个例子。

demo05.png
<p><meter min="0" max="100" value="10" low="20" optimum="60" high="90">10%</meter></p>
<p><meter min="0" max="100" value="70" low="20" optimum="60" high="90">70%</meter></p>
<p><meter min="0" max="100" value="95" low="20" optimum="60" high="90">95%</meter></p>

7. label 的使用

有两种方法可以创建可点击的标签,第一个,也是推荐的做法,用 label 包括表单控件,示例如下:

<label>Your name: <input type="text" name="name"></label>

另一种方法是使用 for 属性 :

<label for="name">Your name: </label>
<input type="text" name="name" id="name">

使用 for 属性的好处是,表单控件不需要出现在 label 的内部,但是因为这需要手动配对,使用起来比较麻烦。除非必须,推荐使用第一种方法。


8. 表单验证
    <form name="signForm">
            <input type="text" name="phone" pattern="[0-9]{11}" id="phone" required>
        <input type="submit" name="">
    </form>

这样的一个表单,我们可以在 JS 中对每个控件进行验证,也可以对整个表单进行验证。假设现在要对 input 控件进行验证,我们可以使用 checkValidity() 方法。

<script>
    if( document.signForm.phone.checkValidity() === false ) {
          console.log("Failed!");
    }
</script>

如果一个表单里有很多个控件,那么我们当然不希望针对每个控件都写一段验证代码,所以这时候可以对整个表单进行验证。

document.signForm.checkValidity();

令人激动人心的是,我们还可以自定义错误提示信息,针对上面表单中的 phone 控件,我们有两个约束规则,分别是 patternrequired, 如果不符合条件,浏览器默认会弹出提醒,像下面这样。

demo01.png

我们可以通过 setCustomValidity() 方法自定义弹出消息。

document.signForm.phone.setCustomValidity("Hello World!");
demo02.png

9. 禁用默认样式

表单元素的默认样式一般都不漂亮,所以有的时候我们想要对元素进行自定义,比如对于 input[type = number] 控件的默认样式是框内有上下调节的按钮,我们可以通过修改样式表,将其去除。

input[type = number]::-webkit-inner-spin-button {
    -webkit-appearance: none;
     margin: 0;
}
修改前.png
修改后.png

不断更新 ...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容