整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端数据提交给后端之HTML表单简单剖析

在开篇

什么是表单呢?当前端想要提交数据给后端,怎么搞?那么在前端开发中,表单是常用的手段,比如常见的场景有:登录框、账号注册页、主机信息录入CMDB等等场景都是需要表单。那么在本篇中,笔者除了讲一些基本的知识点,还会再结合后端的方式来演示如何接收表单提交的数据。希望这些小小的演示可以起到抛砖引玉的效果。

盘点HTML表单基础

1. from元素

构建表单,主要是通过from元素,我们先来一个最简单的小栗子,看下面代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>主机信息录入CMDB</h3>
        <form>
            <label for="hostname">主机名:</label><br>
            <input type="text" id="hostname" name="hostname"><br>
            <label for="ipaddr">IP地址:</label><br>
            <input type="text" id="ipaddr" name="ipaddr"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

效果如下图:

通上面的小栗子可以知道,form表单的主要通途是用于收集用户的输入。在from表单里面,还包含着各种不同类型的input元素,比如我们上面小栗子中用到的文本(text)、提交按钮(submit)。

input元素是表单里最重要的元素,它有很多type属性,下面我们来总结下:

类型描述text文本输入radio单选按钮checkbox提交按钮submit提交按钮button可单击按钮

在上面小栗子中,除了input元素之外,不知道大家注意label元素没有。label元素的主要用途是为input元素定义标签,且用for属性和input元素的id属性进行绑定呢。

2. 单选按钮

什么是单选按钮?就是在多个选项中,你只能选其中1个,不能多选。下面我们看个小栗子,看下面代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>问答题1(单选):某站长,工作经验不足1年,仅从互联网收集学习资料制定学习路线售卖盈利,从道德层面角度分析是否有问题?</h3>
        <form>
            <input type="radio" id="i1" name="problem" value="yes">
            <label for="i1">有</label>
            <input type="radio" id="i2" name="problem" value="no">
            <label for="i2">没有</label>
            <input type="radio" id="i3" name="problem" value="not_clear">
            <label for="i3">不清楚</label>
        </form>
        <h3>问答题2(单选):实际工作经验不足1年的人员折腾的学习资料您觉得是否对你有帮助?</h3>
        <form>
            <input type="radio" id="w1" name="problem" value="yes">
            <label for="w1">有</label>
            <input type="radio" id="w2" name="problem" value="no">
            <label for="w2">没有</label>
            <input type="radio" id="w3" name="problem" value="not_clear">
            <label for="w3">不清楚</label>
        </form>
    </body>
</html>

效果如下图:

上面的小栗子中,出了两道问答题,均为单选题。那么,类似的需求都是可以使用输入类型为radio来实现需要使用单选按钮的场景。

3. 复选框

什么是复选框?复选框就是可以选择多个选项,当需要多选的时候,使用复选框输入类型就对了。看下面代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>问答题1(单选):某站长,工作经验不足1年,仅从互联网收集学习资料制定学习路线售卖盈利,从道德层面角度分析是否有问题?</h3>
        <form>
            <input type="checkbox" id="i1" name="problem" value="yes">
            <label for="i1">有</label>
            <input type="checkbox" id="i2" name="problem" value="no">
            <label for="i2">没有</label>
            <input type="checkbox" id="i3" name="problem" value="not_clear">
            <label for="i3">不清楚</label><br>
            <input type="submit" value="提交">
        </form>
        <h3>问答题2(单选):实际工作经验不足1年的人员折腾的学习资料您觉得是否对你有帮助?</h3>
        <form>
            <input type="checkbox" id="w1" name="problem" value="yes">
            <label for="w1">有</label>
            <input type="checkbox" id="w2" name="problem" value="no">
            <label for="w2">没有</label>
            <input type="checkbox" id="w3" name="problem" value="not_clear">
            <label for="w3">不清楚</label><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

效果如下图:

上面的小栗子中,实现复选框的输入类型是checkbox,这个是重点哦!

4. 提交按钮

当有数据要提交给后端的时候怎么搞?如果后端是API服务,可以给它提交json。如果是前端页面,就需要通过构建表单来获取用户的输入。基于表单提交数据给后端,怎么提交?需要一个可以点击的提交按钮,那这个按钮怎么来?先看下面代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>主机信息</h3>
        <form>
            <label for="ipaddr">IP地址</label>
            <input type="text" id="ipaddr" name="ip"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

效果如下图:

输入类型为submit,说明它就是提交按钮,注意上面代码type="submit"了吗?

HTML表单重要属性

1. Action属性

在之前的例子中,前端表单需要将数据提交给后端,除了需要一个提交按钮外,还需要action属性。当点击提交按钮后,表单的数据该发到后端的哪个url进行处理,就是定义在action属性中。接下来,我们结合前端和后端直接来个小实战,后端代码用Python的Flask框架。

前端代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>主机信息</h3>
        <form action="http://192.168.11.10:8088/ttropsstack" target="_blank">
            <label for="ipaddr">IP地址</label>
            <input type="text" id="ipaddr" name="ip"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

后端代码:

from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=["GET", "POST"])
def ttropsstack():
    args = request.args
    print 'ip addr is: %s' % args.get('ip')
    return 'ok'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

前端和后端的代码写完后,我们接下来看看效果

输入IP地址后,点击提交

这个ok是后端返回的

后端接收到数据后,啥也没做,只是做了简单打印

这个小栗子很简单,通过这个小栗子,是不是对action属性的用法有了进一步的理解呢?

2. Method属性

method属性的用途是指定提交数据的http方法,通常有2个,get和post。接下来我们在上个小栗子的基础上做个小改造,看下面代码

前端代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>主机信息</h3>
        <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="get">
            <label for="ipaddr">IP地址</label>
            <input type="text" id="ipaddr" name="ip"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

后端代码:

from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=["POST"])
def ttropsstack():
    args = request.args
    print 'ip addr is: %s' % args.get('ip')
    return 'ok'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

当前端输入数据后,提交表单时,直接告诉你这是不允许的方法

在这个例子中,是因为前端的表单了指定了method为get请求,而后端接收数据的method规定了需要post请求,故所以出现这个问题。

下面我们改造一下后端代码:

# coding: utf8
from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=['GET','POST'])
def ttropsstack():
    if request.method == 'POST':
        print request.get_data(as_text=True)
        return 'ok'
    else:
        return '提交数据需要post请求'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

前端表单中的method还是保持get请求,再次提交,后端的返回如下:

看到了吗?后端判断前端过来的请求是get还是post,很显然,前端过来的请求是get,并且返回了非常友好的提示。

接下来我们继续改造一下前端的代码,将请求修改为post,代码如下:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <h3>主机信息</h3>
        <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="post">
            <label for="ipaddr">IP地址</label>
            <input type="text" id="ipaddr" name="ip"><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

后端代码也稍微改造一下,改变接收前端数据的方法

# coding: utf8
from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=['GET','POST'])
def ttropsstack():
    if request.method == 'POST':
        a = request.form
        print a.get('ip')
        print type(a)
        return 'ok'
    else:
        return '提交数据需要post请求'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

输入IP地址,并点击提交

提交后,后端给前端返回了ok

接下来看下后端,后端啥也没做,就获取到表单的数据,然后打印了数据,并且打印了下数据类型

好了,关于前端的action属性和Method属性就讲到这里了。为了讲解action和method,还结合了后端的一丢丢知识,前端和后端的知识点以后都会慢慢讲到哈!

HTML表单常用元素

1. 下拉列表

先来个前端代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="post">
            <label for="opslist">运维开发应掌握的技能:</label>
            <select id="opslist" name="opslist">
                <option value="python">Python语言</option>
                <option value="go">Go语言</option>
                <option value="shell">Shell语言</option>
                <option value="database">数据库</option>
                <option value="frontend">前端</option>
                <option value="linux">Linux</option>
                <option value="network">网络</option>
                <option value="storage">存储</option>
            </select>
            <input type="submit">
        </form>
    </body>
</html>

后端代码:

# coding: utf8
from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=['GET','POST'])
def ttropsstack():
    if request.method == 'POST':
        a = request.form
        print a.get('opslist')
        return 'ok'
    else:
        return '提交数据需要post请求'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

在下拉框中选择“Go语言”,并提交

后端啥也没干,就只做了打印

2. 允许多选

前端代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>彩虹运维技术栈社区主页</title>
    </head>
    <body>
        <h2>彩虹运维技术栈社区,公众号ID:TtrOpsStack</h2>
        <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="post">
            <label for="opslist">运维开发应掌握的技能:</label>
            <select id="opslist" name="opslist" size="6" multiple>
                <option value="python">Python语言</option>
                <option value="go">Go语言</option>
                <option value="shell">Shell语言</option>
                <option value="database">数据库</option>
                <option value="frontend">前端</option>
                <option value="linux">Linux</option>
                <option value="network">网络</option>
                <option value="storage">存储</option>
            </select>
            <input type="submit">
        </form>
    </body>
</html>

上述前端代码中,是使用multiple属性来实现选择多个值。

后端代码的打印方式稍微做了些许调整:

# coding: utf8
from flask import Flask, request

webapp = Flask(__name__)

@webapp.route('/ttropsstack', methods=['GET','POST'])
def ttropsstack():
    if request.method == 'POST':
        data = request.get_data()
        print data
        return 'ok'
    else:
        return '提交数据需要post请求'

if __name__ == '__main__':

    webapp.run(host="0.0.0.0", port=8088, debug=True)

按住ctrl或者shift键可进行多选

后端打印的效果图下图:

写在最后

关于表单基础知识点的讲解就这么愉快的结束了,关于更多表单的元素、输入属性、输入类型可自行查阅和实战,笔者因时间有限就不一一演示。感谢您的阅读,望多多关注我们、点赞、转发!

本文转载于(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/L-Msv39JrF7AzRx4K1OLjA

HTML中使用 <select><option> 元素创建选择框。而 <select> 元素对应的是 HTMLSelectElement 接口,<option> 元素对应的是 HTMLOptionElement 接口。这两个接口都是通过 HTMLElement 接口从其他 HTML 元素共享所有属性和方法。

先从 <select> 元素对应的 HTMLSelectElement 接口开始介绍专属的属性和方法。

  • autofocus:返回 boolean 值,表示控件在页面加载时是否应该具有输入焦点,除非用户覆盖它。等价于 <select> 元素中的 autofocus 属性。
  • disabled: 返回 boolean 值,表示控件是否被禁用。等价于 <select> 元素中的 disabled 属性。
  • form:返回 HTMLFormElement 值的只读属性,表示与此元素关联的表单。
  • labels:与此元素关联的 <label> 元素组成的 NodeList
  • length:返回 number 值,表示 <select> 元素中 <option> 元素的数量。
  • multiple:返回boolean 值,表示是否允许多选,等价于<select> 元素中的 multiple 属性。
  • name:返回 string 值,表示此控件的名称。等价于 <select> 元素中的 name 属性。
  • options:返回 HTMLOptionsCollection 值的可读属性,表示此元素包含的 <option> 元素集。
  • required:返回 boolean 值,表示用户在提交表单之前是否需要选择值。等价于 <select> 元素中的 required 属性。
  • selectedIndex:返回 number 值,表示第一个选定的 <option> 元素的索引。值为 -1 表示未选择任何元素,对于允许多选的列表,始终是第一个选项的索引。
  • selectedOptions:返回 HTMLCollection 值的可读属性,表示所选的 <option> 的元素集。
  • size:返回 number 值,表示控件中可见项的数量。等价于 <select> 元素的 size 属性。默认值为 1,如果 multipletrue ,则为 4
  • type:返回 string 值的只读属性,表示表单控件类型。当 multipletrue 时,它返回 "select-multiple",否则返回 "select-one"
  • validationMessage:返回 string 值的只读属性,表示一个本地化消息,描述了控件不满足的验证约束。如果willvalidate=false,或者它满足其约束,则此属性为空字符串。
  • validity:返回 ValidityState 的只读属性,表示该控件所处的有效状态。
  • value:返回 string 值,表示表单控件的值。返回 option 元素的 value 属性,如果没有该属性,则返回 text 属性。
  • willValidate:返回 boolean 值的只读属性,表示该按钮是否是约束验证的候选者。如果任何条件禁止约束验证,则为 false
  • add(elemen, before):将 element 元素添加到 before 元素之前。element 参数为要添加的 <option> 元素, before 参数为已存在的 <option> 元素,before 为可选参数。
  • checkValidity():检查元素是否有任何约束以及它是否满足它们。如果元素未通过约束,浏览器将在元素处触发可取消的 invalid 事件并返回 false
  • item(index):从 <select>元素的 options 集合中获取一个 <option> 元素。
  • namedItem(name):获取具有指定名称的 options 集合中的 <option> 元素。而传入的 name 参数可以匹配 <option> 元素的 idname 属性。
  • remove(index):从 <select> 元素的 options 集合中删除指定索引处的元素。
  • reportValidity():此方法向用户报告元素约束的问题。如果有问题,它会在元素处触发可取消的 invalid 事件,并返回 false;如果没有问题,则返回 true
  • setCustomValidity(error):将 <select> 元素的自定义有效性消息设置为指定的消息。使用空字符串表示元素不具有自定义有效性错误。

下面介绍一下<select> 元素根据不同选中状态下的value属性的值:

<select name="location" id="selLocation">
    <option value="Sunnyvale, CA">Sunnyvale</option>
    <option value="Los Angeles, CA">Los Angeles</option>
    <option value="Mountain View, CA">Mountain View</option>
    <option value="">China</option>
    <option>Australia</option>
</select>

当选中选项框中的第一项时,<select> 元素的 value 值为 "Sunnyvale, CA";而选中第四项时,<select> 元素的 value 值为 "",因为该项的 value 属性是空字符串;选中最后一项,则 value 值为 "Australia",因为该 <option> 元素没有指定 value 属性。

因此,根据以上的例子,<select> 元素的value属性根据以下规则获取值:

  • 无选中项,<select> 元素的 value 属性为空字符串。
  • 有一个选中项,且其 value 属性有值,则 <select> 元素的 value 属性的值为 <option> 元素的 value 属性的值。
  • 有一个选中项,且其 value 属性没有指定值,则 <select> 元素的 value 属性的值是 <option> 元素的 text 值。
  • 有多个选中项,则 <select> 元素的值会获取第一个 <option> 元素的value值或 text 值。

再介绍 <option> 元素对应的 HTMLOptionElement 接口专属属性和方法。

  • defaultSelected:返回 boolean 值。表示默认情况下是否被选中。
  • disabled:返回 boolean 值。表示该选项不可用,等价于 <option> 元素的 disabled 属性的值。
  • form:返回 HTMLFormElement 值的只读属性。如果 <option><select> 元素的后代,表示与相应 <select> 元素的 form 值相同的值,如果不是,则为 null
  • index:返回 string 的只读属性。表示选项在 options 集合中的索引。
  • label:返回 string 的只读属性。表示 <option> 元素的标签,等价于 <option> 元素的 label 属性。如果未设置此属性,则读取该属性将返回元素的文本内容。
  • selected:返回 boolean 值,表示当前是否选择了该选项。
  • text:返回 string 值。表示选项的文本值。
  • value:返回 string 值。表示选项的值。等价于 <option> 元素的 value 属性。

这里强调一下,<select> 元素的 change 事件与其它表单字段是不一样的。其它表单字段会在自己的值改变后触发 change 事件,然后字段失去焦点。而 <select> 会在选中一项时立即触发 change 事件。

选项处理

对于只允许选择一项的 <select> 元素,获取选项最简单的方式是使用 <select> 元素的 selectIndex 属性,如下面的例子:

let selectedOption = selectbox.options[selectbox.selectedIndex];

获取到 <option> 元素后,就可以根据 <option> 元素的属性和方法获取想要的信息。

对于允许多选的 <select> 元素,selectedIndex 属性就像只允许选择一项一样。设置 selectedIndex 会移除所有选项,只选择指定的项,而获取 selectedIndex 只会返回选中的第一项的索引。

选项还可以通过取得选项的引用并将其 selected 属性设置为 true 来选中。例如,以下代码会选中 <select> 的第一项:

selectbox.options[0].selected = true;

selectedIndex 不同,设置选项的 selected 属性不会在多选时移除其他选项,从而可以动态选择任意多个选项。如果修改单选框中选项的 selected 属性,则其他选项会被移除。要注意的是,把 selected 属性设置为 false 对单选框没有影响。

通过 selected 属性可以确定选择框中哪个选项被选中。要取得所有选中项,需要循环选项集合逐一检测 selected 属性,比如:

function getSelectedOptions(selectbox){
    let result = new Array();
    for (let option of selectbox.options) {
        if (option.selected) {
            result.push(option);
        }
    }
    return result;
}

添加选项

可以使用 JavaScript 动态创建选项并将它们添加到选择框。首先,可以使用 DOM 方法,如下所示:

let newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("Option text"));
newOption.setAttribute("value", "Option value");
selectbox.appendChild(newOption);

以上代码创建了一个新的<option>元素,使用文本节点添加文本,设置其 value 属性,然后将其添加到选择框。添加到选择框之后,新选项会立即显示出来。

浏览器原生提供 Option() 构造函数创建 HTMLOptionElement 实例:

new Option(text, value, defaultSelected, selected) : HTMLOptionElement
  • text:一个可选的 string 值参数,表示该选项的文本内容。如果省略,返回空字符串。
  • value:一个可选的 string 值参数,表示该选项的值。如果省略,默认返回 text 属性的值。
  • defaultSelected:一个可选的 boolean 值参数,表示该项是否默认选中,默认为 false。注意,即使设为 true,也不代表该项的 selected 属性为 true
  • selected:一个可选的 boolean 值参数,表示该项是否选中。默认为 false

来看案例:

let newOption = new Option("Option Text", "Option Value", true);

创建之后,需要将该实例添加到 HTML 的 <select> 元素中,这里有两种添加方法:

  • DOM 操作中的 appendChild() 方法。
  • HTMLSelectElement 接口中的 add() 方法。

这里详细介绍下 add() 方法:

add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
  • element:一个 HTMLOptionElementHTMLOptGroupElement 元素的参数。
  • before:可选的参数,是集合中的一个元素或者类型为 number 的索引,表示在 element 参数之前插入。如果传入的是 null 或索引不存在,新元素会添加在集合的末尾。

如果想要符合所有浏览器的规范,可以传入 undefined 作为第二个参数。

let newOption = new Option("Option text", "Option value", true);
selectbox.add(newOption, undefined);

这里注意一下 defaultSelectedselected 两个参数,有时候容易弄混。selected 属性为 true 时,该 <option> 当前状态处于已选择状态。defaultSelected 属性为 true 时,表示 <option> 在默认情况下为已选择状态,但不代表 <option> 的当前状态是已选择状态。当页面重置时,selected 属性值为 true<option> 可能会变成未选择状态,而 defaultSelected 属性值为 true<option> 则一定会变成已选择状态。

移除选项

移除 <option> 元素的方法也不止一种,下面列举的方法都可以实现:

  • DOM 操作中的 removeChild() 方法。
  • HTMLSelectElement 接口中的 remove() 方法。传入的参数为要移除的 <option> 元素的索引。
  • 直接将指定 <option> 元素赋值为 null。如 selects.options[1] = null

要清除选择框的所有选项,需要迭代所有选项并逐一移除它们,如下面例子所示:

function clearSelectbox(selectbox) {
    for (let index = 0; index < selectbox.options.length;) {
        selectbox.remove(0);
    }
}

移动和重排选项

使用 DOM 操作中的 appendChild() 方法实现从一个 <select> 元素中将 <option> 移到另一个 <select> 元素中,这种实现方法会将 <option> 元素先从其父元素中移除,然后再插入指定位置。如下所示:

let selectbox1 = document.getElementById("selLocations1");
let selectbox2 = document.getElementById("selLocations2");
selecbox2.appendChild(selectbox1.options[0]);

移动选项和移除选项都会导致每个 <option>index 属性重置。

重排 <option> 的话,使用 DOM 操作中的 insertBefore() 方法,而移到最后位置,还是使用 appendChild() 方法较为方便。

下面的代码演示了将一个 <option><select> 中前移一个位置:

let optToMove = selectbox.options[1];
selectbox.insertBefore(optToMove, selectbox.options[optionToMove.index-1]);

这个例子首先获得要移动 <option> 的索引,然后将其插入之前位于它前面的 <option> 之前,其中第二行代码适用于除第一个 <option> 之外的所有 <option>。下面的代码则可以将<option>向下移动一个位置:

let optionToMove = selectbox.options[1];
selectbox.insertBefore(optionToMove,
selectbox.options[optionToMove.index+2]);

总结

<select><option> 是在 HTML 页面布局时,经常使用的表单控件,学会使用与之对应的 HTMLSelectElementHTMLOptionElement 接口中的属性和方法会很容易的操控 <select><option> 元素。借助于 DOM 操作 <select><option> 也较为方便。

这里是云端源想IT,帮你轻松学IT”

嗨~ 今天的你过得还好吗?

世界微尘里

吾宁爱与憎


- 2024.03.18 -

在互联网的世界中,表单是用户与网站进行互动的重要桥梁。无论是注册新账号、提交反馈、还是在线购物,表单都扮演着至关重要的角色。在网页中,我们需要跟用户进行交互,收集用户资料,此时就需要用到表单标签。

HTML提供了一系列的表单标签,使得开发者能够轻松地创建出功能丰富的表单。今天我们就来深入探讨这些标签,了解它们的作用以及如何使用它们来构建一个有效的用户界面。



一、表单的组成

在HTML中,一个完整的表单通常由表单域、表单控件(表单元素)和提示信息三个部分构成。

表单域

  • 表单域是一个包含表单元素的区域
  • 在HTML标签中,<form>标签用于定义表单域,以实现用户信息的收集和传递
  • <form>会把它范围内的表单元素信息提交给服务器


表单控件

这些是用户与表单交云的各种元素,如<input>(用于创建不同类型的输入字段)、<textarea>(用于多行文本输入)、<button>(用于提交表单或执行其他操作)、<select>和<option>(用于创建下拉列表)等。



提示信息

这些信息通常通过<label>标签提供,它为表单控件提供了描述性文本,有助于提高可访问性。<label>标签通常与<input>标签一起使用,并且可以通过for属性与<input>标签的id属性关联起来。


这三个部分共同构成了一个完整的HTML表单,使得用户可以输入数据,并通过点击提交按钮将这些数据发送到Web服务器进行处理。


二、表单元素

在表单域中可以定义各种表单元素,这些表单元素就是允许用户在表单中输入或者选择的内容控件。下面就来介绍HTML中常用的表单元素。


1、<form>标签:基础容器

作用:定义一个表单区域,用户可以在其中输入数据进行提交。

<form action="submit.php" method="post">

其中action属性指定了数据提交到的服务器端脚本地址,method属性定义了数据提交的方式(通常为GET或POST)。


2、<input>标签:数据输入

<input>标签是一个单标签,用于收集用户信息。允许用户输入文本、数字、密码等。

<input type="text" name="username" placeholder="请输入用户名">

type属性决定了输入类型,name属性定义了数据的键名,placeholder属性提供了输入框内的提示文本。


<input>标签的属性

下面举个例子来说明:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>

<body>
<form>
用户名:<input type="text" value="请输入用户名"><br>
密码:<input type="password"><br>
性别:男<input type="radio" name="sex" checked="checked"> 女<input type="radio" name="sex"><br>
爱好:吃饭<input type="checkbox"> 睡觉<input type="checkbox"> 打豆豆<input type="checkbox"><br>
<input type="submit" value="免费注册">
<input type="reset" value="重新填写">
<input type="button" value="获取短信验证码"><br>
上传头像:<input type="file">
</form>
</body>
</html>


3、<label>标签:关联说明

它与输入字段如文本框、单选按钮、复选框等关联起来,以改善网页的可用性和可访问性。<label>标签有两种常见的用法:


1)包裹方式:

在这种用法中,<label>标签直接包裹住关联的表单元素。例如:

<label>用户名:<input type="text" name="username"></label>

这样做的好处是用户点击标签文本时,关联的输入字段会自动获取焦点,从而提供更好的用户体验。



2)使用for属性关联:

在这种用法中,<label>标签通过for属性与目标表单元素建立关联,for属性的值应与目标元素的id属性相匹配。例如:

<label for="username">用户名:</label><input type="text" id="username" name="username">

这样做的优势是单击标签时,相关的表单元素会自动选中(获取焦点),从而提高可用性和可访问性。


4、<select>和<option>标签:下拉选择

在页面中,如果有多个选项让用户选择,并且想要节约页面空间时,我们可以使用标签控件定义下拉列表。


注意点:

  • <select>中至少包含一对<option>
  • 在<option>中定义selected=“selected”时,当前项即为默认选中项
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form>
籍贯:
<select>
<option>山东</option>
<option>北京</option>
<option>西安</option>
<option selected="selected">火星</option>
</select>
</form>
</body>
</html>


5、<textarea>标签:多行文本输入

当用户输入内容较多的情况下,我们可以用表单元素标签替代文本框标签。

  • 允许用户输入多行文本。
<textarea name="message" rows="5" cols="30">默认文本</textarea>

rows和cols属性分别定义了文本区域的行数和列数。


代码示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form>
今日反馈:
<textarea>请在此输入内容</textarea>
</form>
</body>
</html>



6、<button>标签:按钮控件

创建一个可点击的按钮,通常用于提交或重置表单。它允许用户放置文本或其他内联元素(如<i>、<b>、<strong>、<br>、<img>等),这使得它比普通的<input type="button">具有更丰富的内容和更强的功能。

<button type="submit">提交</button>

type属性为submit时表示这是一个提交按钮。


7、<fieldset>和<legend>标签:分组和标题

通常用于在HTML表单中对相关元素进行分组,并提供一个标题来描述这个组的内容。



<fieldset>标签:该标签用于在表单中创建一组相关的表单控件。它可以将表单元素逻辑分组,并且通常在视觉上通过围绕这些元素绘制一个边框来区分不同的组。这种分组有助于提高表单的可读性和易用性。

<legend>标签:它总是与<fieldset>标签一起使用。<legend>标签定义了<fieldset>元素的标题,这个标题通常会出现在浏览器渲染的字段集的边框上方。<legend>标签使得用户更容易理解每个分组的目的和内容。

代码示例:

<form>
<fieldset>
<legend>个人信息</legend>
<label for="name">姓名:</label>
<input type="text" id="name" name="name"><br><br>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email"><br><br>
</fieldset>
<fieldset>
<legend>兴趣爱好</legend>
<input type="checkbox" id="hobby1" name="hobby1" value="music">
<label for="hobby1">音乐</label><br>
<input type="checkbox" id="hobby2" name="hobby2" value="sports">
<label for="hobby2">运动</label><br>
<input type="checkbox" id="hobby3" name="hobby3" value="reading">
<label for="hobby3">阅读</label><br>
</fieldset>
<input type="submit" value="提交">
</form>

在这个示例中,我们使用了两个<fieldset>元素来组织表单的不同部分。第一个<fieldset>包含姓名和邮箱字段,而第二个<fieldset>包含三个复选框,用于选择用户的兴趣爱好。每个<fieldset>都有一个<legend>元素,用于提供标题。这样,用户在填写表单时可以更清晰地了解每个部分的内容。

想要快速入门前端开发吗?推荐一个前端开发基础课程,这个老师讲的特别好,零基础学习无压力,知识点结合代码,边学边练,可以免费试看试学,还有各种辅助工具和资料,非常适合新手!点这里前往学习哦!云端源想

8、<datalist>标签:预定义选项列表

<datalist>标签是HTML5中引入的一个新元素,它允许开发者为输入字段提供预定义的选项列表。当用户在输入字段中输入时,浏览器会显示一个下拉菜单,其中包含与用户输入匹配的预定义选项。


使用<datalist>标签可以提供更好的用户体验,因为它可以帮助用户选择正确的选项,而不必手动输入整个选项。此外,<datalist>还可以与<input>元素的list属性结合使用,以将预定义的选项列表与特定的输入字段关联起来。



下面是一个使用<datalist>标签的代码示例:

<form>
<label for="color">选择你喜欢的颜色:</label>
<input type="text" id="color" name="color" list="colorOptions">
<datalist id="colorOptions">
<option value="红色">
<option value="蓝色">
<option value="绿色">
<option value="黄色">
<option value="紫色">
</datalist>
<input type="submit" value="提交">
</form>


9、<output>标签:计算结果输出

<output>标签是HTML5中引入的一个新元素,它用于显示计算结果或输出。该标签通常与JavaScript代码结合使用,通过将计算结果赋值给<output>元素的value属性来显示结果。


<output>标签可以用于各种类型的计算和输出,例如数学运算、字符串处理、数组操作等。它可以与<input>元素一起使用,以实时更新计算结果。



下面是一个使用<output>标签的示例:

<form>
<label for="num1">数字1:</label>
<input type="number" id="num1" name="num1" oninput="calculate()"><br><br>
<label for="num2">数字2:</label>
<input type="number" id="num2" name="num2" oninput="calculate()"><br><br>
<label for="result">结果:</label>
<output id="result"></output>
</form>

<script>
function calculate() {
var num1 = parseInt(document.getElementById("num1").value);
var num2 = parseInt(document.getElementById("num2").value);
var result = num1 + num2;
document.getElementById("result").value = result;
}
</script>


10、<progress>标签:任务进度展示

<progress>标签是HTML5中用于表示任务完成进度的一个新元素。它通过value属性和max属性来表示进度,其中value表示当前完成的值,而max定义任务的总量或最大值。

示例:

<!DOCTYPE html>
<html>
<head>
<title>Progress Example</title>
</head>
<body>
<h1>File Download</h1>
<progress id="fileDownload" value="0" max="100"></progress>
<br>
<button onclick="startDownload()">Start Download</button>

<script>
function startDownload() {
var progress = document.getElementById("fileDownload");
for (var i = 0; i <= 100; i++) {
setTimeout(function() {
progress.value = i;
}, i * 10);
}
}
</script>
</body>
</html>

在上面的示例中,我们创建了一个名为"fileDownload"的<progress>元素,并设置了初始值为0,最大值为100。我们还添加了一个按钮,当用户点击该按钮时,会触发名为"startDownload"的JavaScript函数。这个函数模拟了一个文件下载过程,通过循环逐步增加<progress>元素的value属性值,从而显示下载进度。


11、<meter>标签:度量衡指示器

<meter>标签在HTML中用于表示度量衡指示器,它定义了一个已知范围内的标量测量值或分数值,通常用于显示磁盘使用情况、查询结果的相关性等。例如:

<p>CPU 使用率: <meter value="0.6" min="0" max="1"></meter> 60%</p>
<p>内存使用率: <meter value="0.4" min="0" max="1"></meter> 40%</p>

在这个示例中,我们使用了两个<meter>标签来分别显示CPU和内存的使用率。value属性表示当前的测量值,min和max属性分别定义了测量范围的最小值和最大值。通过这些属性,<meter>标签能够清晰地显示出资源的使用情况。



需要注意的是,<meter>标签不应该用来表示进度条,对于进度条的表示,应该使用<progress>标签。


12、<details>和<summary>标签:详细信息展示

<details>和<summary>标签是HTML5中新增的两个元素,用于创建可折叠的详细信息区域。

<details>标签定义了一个可以展开或折叠的容器,其中包含一些额外的信息。它通常与<summary>标签一起使用,<summary>标签定义了<details>元素的标题,当用户点击该标题时,<details>元素的内容会展开或折叠。

示例:

<details>
<summary>点击查看详细信息</summary>
<p>这里是一些额外的信息,用户可以点击标题来展开或折叠这些信息。</p>
</details>

在这个示例中,我们使用了<details>标签来创建一个可折叠的容器,并在其中添加了一个<summary>标签作为标题。当用户点击这个标题时,容器的内容会展开或折叠。


总结:

HTML表单标签是构建动态网页的基石,它们使得用户能够与网站进行有效的交互。


通过合理地使用这些标签,开发者可以创建出既美观又功能强大的表单,从而提升用户体验和网站的可用性。所以说,掌握这些标签的使用,对于前端开发者来说是至关重要的。


我们下期再见!


END

文案编辑|云端学长

文案配图|云端学长

内容由:云端源想分享