【H5】12 表单 其一 第一个表单
本系列的第一篇文章提供了您第一次创建HTML表单的经验,
包括设计一个简单表单,使用正确的HTML元素实现它,
通过CSS添加一些非常简单的样式,以及如何将数据发送到服务器。
HTML表单是什么?
HTML表单是用户和web站点或应用程序之间交互的主要内容之一。
它们允许用户将数据发送到web站点。
大多数情况下,数据被发送到web服务器,但是web页面也可以自己拦截它并使用它。
HTML表单是由一个或多个小部件组成的。
这些小部件可以是文本字段(单行或多行)、选择框、按钮、复选框或单选按钮。
大多数情况下,这些小部件与描述其目的的标签配对——正确实现的标签能够清楚地指示视力正常的用户和盲人用户输入表单所需的内容。
HTML表单和常规HTML文档的主要区别在于,大多数情况下,表单收集的数据被发送到web服务器。
在这种情况下,您需要设置一个web服务器来接收和处理数据。
如何设置这样的服务器超出了本文的范围,但是如果您想了解更多,请参阅模块后面的发送表单数据。
设计表单
在开始编写代码之前,最好先退一步,花点时间考虑一下您的表单。
设计一个快速的模型将帮助您定义您想要询问用户的正确的数据集。
从用户体验(UX)的角度来看,要记住:表单越大,失去用户的风险就越大。
保持简单,保持专注:只要求必要的数据。在构建站点或应用程序时,设计表单是非常重要的一步。
这超出了本文的范围,涵盖了表单的用户体验,但是如果您想深入了解这个主题,您应该阅读下面的文章:
- 杂志<Smashing Magazine>中有很好的关于表单用户体验的文章,或许其中最重要的应该是他们的Extensive Guide To Web Form Usability.
- UXMatters 也是一个非常有思想的资源,从基本的最佳实践到复杂的问题如多页表单,都有很好的建议。
在本文中,我们将构建一个简单的联系人表单。
让我们做一个粗略的草图。
我们的表单将包含三个文本字段和一个按钮。
我们向用户询问他们的姓名、电子邮件和他们想要发送的信息。
点击这个按钮将把他们的数据发送到一个web服务器。
主动学习:使用HTML实现我们的表单
好了,现在我们准备进入HTML代码并对表单进行编码。
为了构建我们的联系人表单,我们将使用以下HTML元素:<form>
, <label>
, <input>
, <textarea>
, and <button>
.
在进一步讨论之前,先创建一个简单HTML模板的本地副本—您将在这里输入您的表单HTML。
<form>
元素
所有HTML表单都以一个<form>
元素开始:
<form action="/my-handling-form-page" method="post"> </form>
这个元素正式定义了一个表单。就像<div>
元素或<p>
元素,它是一个容器元素,但它也支持一些特定的属性来配置表单的行为方式。它的所有属性都是可选的,但实践中最好至少要设置action
属性和method
属性。
action
属性定义了在提交表单时,应该把所收集的数据送给谁(/那个模块)(URL)去处理。.method
属性定义了发送数据的HTTP方法(它可以是“get”或“post”).
注意:如果您想深入了解这些属性是如何工作的,那么将在发送表单数据文章中详细说明。
现在,将上面的<form>
元素添加到您的HTML主体中
<label>
, <input>
和 <textarea>
元素
我们的联系人表单非常简单,包含三个文本字段,每个字段都有一个标签。
该名称的输入字段将是一个基本的单行文本字段,电子邮件的输入字段将是一个只接受电子邮件地址的单行文本字段,而消息的输入字段将是一个基本的多行文本字段。
就HTML代码而言,我们需要如下的东西来实现这些表单小部件:
<form action="/my-handling-form-page" method="post">
<div>
<label for="name">Name:</label>
<input type="text" id="name">
</div>
<div>
<label for="mail">E-mail:</label>
<input type="email" id="mail">
</div>
<div>
<label for="msg">Message:</label>
<textarea id="msg"></textarea>
</div>
</form>
更新您的表单代码,使其看起来像上面的代码。
使用<div>
元素可以使我们更加方便地构造我们自己的代码,并且更容易样式化(参见本文后面的文章)。
注意在所有<label>
元素上使用for
属性;它是将标签链接到表单小部件的一种正规方式。
这个属性引用对应的小部件的id
。这样做有一些好处。
最明显的一个好处是允许用户单击标签以激活相应的小部件。
如果您想更好地理解这个属性的其他好处,您可以找到如何构造HTML表单的详细信息。
在 <input>
元素中,最重要的属性是type
属性。
这个属性非常重要,因为它定义了<input>
属性的行为方式。
它可以从根本上改变元素,所以要注意它。稍后您将在原生表单控件文章中找到更多关于此的内容。
- 在我们的简单示例中,我们使用值
text
作为第一个输入——这个属性的默认值。它表示一个基本的单行文本字段,接受任何类型的文本输入。 - 对于第二个输入,我们使用值
email
,它定义了一个只接受格式正确的电子邮件地址的单行文本字段。这会将一个基本的文本字段转换为一种“智能”字段,该字段将对用户输入的数据进行一些检查。在稍后的表单数据验证文章中,您将了解到更多关于表单验证的信息。
最后但同样重要的是,要注意<input>
和 <textarea></textarea>
的语法。这是HTML的一个奇怪之处。
<input>
标签是一个空元素,这意味着它不需要关闭标签。相反, <textarea>
不是一个空元素,因此必须使用适当的结束标记来关闭它。
这对HTML表单的特定特性有影响:定义默认值的方式。
要定义<input>
的默认值,你必须使用value
属性,如下所示:
<input type="text" value="by default this element is filled with this text" />
相反,如果您想定义<textarea>
的默认值,您只需在<textarea>
元素的开始和结束标记之间放置默认值,就像这样:
<textarea>by default this element is filled with this text</textarea>
<button>
元素
我们的表格已经快准备好了,我们只需要再添加一个按钮,让用户在填写完表单后发送他们的数据。
这是通过使用 <button>
元素完成的。在 </form>这个结束
标签上方添加以下内容:
<div class="button">
<button type="submit">Send your message</button>
</div>
您会看到<button>
元素也接受一个 type
属性,它接受submit
, reset
或者 button
三个值中的任一个。
- 单击
type
属性定义为submit
值(也是默认值)的按钮会发送表单的数据到<form>
元素的action
属性所定义的网页。 - 单击
type
属性定义为reset
值的按钮 将所有表单小部件重新设置为它们的默认值。从用户体验的角度来看,这被认为是一种糟糕的做法。 - 单击
type
属性定义为button
值的按钮……不会发生任何事!这听起来很傻,但是用JavaScript构建定制按钮非常有用。
注意:您还可以使用相应类型的 <input>
元素来生成一个按钮,如 <input type="submit">
。
<button>
元素的主要优点是, <input>
元素只允许纯文本作为其标签,而<button>
元素允许完整的HTML内容,允许更复杂、更有创意的按钮文本。
基本表单样式
现在您已经完成了表单的HTML代码,尝试保存它并在浏览器中查看它。
现在,你会看到它看起来很丑。
注意: 如果你怀疑你的HTML代码不对,试着把它和我们完成的例子进行比较 —— first-form.html (你也可以观看预览版)。
如何排布好表单是公认的难点。这超出了本文的讨论范围,所以现在我们只需要让您添加一些CSS来让它看起来很好。
首先,在您的HTML头部中添加一个 <style>
元素。应该是这样的:
<style> </style>
在样式标签中,添加如下的CSS,如下所示:
form {
/* 居中表单 */
margin: 0 auto;
width: 400px;
/* 显示表单的轮廓 */
padding: 1em;
border: 1px solid #CCC;
border-radius: 1em;
} form div + div {
margin-top: 1em;
} label {
/* 确保所有label大小相同并正确对齐 */
display: inline-block;
width: 90px;
text-align: right;
} input, textarea {
/* 确保所有文本输入框字体相同
textarea默认是等宽字体 */
font: 1em sans-serif; /* 使所有文本输入框大小相同 */
width: 300px;
box-sizing: border-box; /* 调整文本输入框的边框样式 */
border: 1px solid #999;
} input:focus, textarea:focus {
/* 给激活的元素一点高亮效果 */
border-color: #000;
} textarea {
/* 使多行文本输入框和它们的label正确对齐 */
vertical-align: top; /* 给文本留下足够的空间 */
height: 5em;
} .button {
/* 把按钮放到和文本输入框一样的位置 */
padding-left: 90px; /* 和label的大小一样 */
} button {
/* 这个外边距的大小与label和文本输入框之间的间距差不多 */
margin-left: .5em;
}
现在,它看起来没那么丑了。
注意: 你可以在GitHub上的这里找到它 first-form-styled.html (也可以在这儿看运行结果).
向您的web服务器发送表单数据
最后一部分,也许是最棘手的部分,是在服务器端处理表单数据。
如前所述,大多数时候HTML表单是向用户请求数据并将其发送到web服务器的一种方便的方式。
<form>
元素将定义如何通过action
属性和 method
属性来发送数据的位置和方式。
但这还不够。我们还需要为我们的数据提供一个名称。
这些名字对双方都很重要:在浏览器端,它告诉浏览器给数据各自哪个名称,在服务器端,它允许服务器按名称处理每个数据块。
要将数据命名为表单,您需要在每个表单小部件上使用 name
属性来收集特定的数据块。让我们再来看看我们的表单代码:
<form action="/my-handling-form-page" method="post">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name">
</div>
<div>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email">
</div>
<div>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</div> ...
在我们的例子中,表单会发送三个已命名的数据块 "user_name
", "user_email
", 和 "user_message
"。
这些数据将用使用HTTP POST
方法,把信息发送到URL为 "/my-handling-form-page
"目录下。
在服务器端,位于URL"/my-handling-form-page
" 上的脚本将接收的数据作为HTTP请求中包含的3个键/值项的列表。
这个脚本处理这些数据的方式取决于您。每个服务器端语言(PHP、Python、Ruby、Java、c等等)都有自己的机制。
深入到这个主题已经超出了本指南的范围,但是如果您想了解更多,我们已经在发送表单数据文章中提供了一些示例。
摘自: https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Forms/Your_first_HTML_form
【H5】12 表单 其一 第一个表单的更多相关文章
- Sql 关于 查俩个表 第二个表用到第一个表的某一个数据
今天在写程序的时候遇到一个问题 有一个这个需求 select top 1 Name,[Address] from UserInfo;select * from shoppingAddress whe ...
- mysql连表查空,查询第二张表中没有第一张表中的数据
select consumer_id,user_name,mobile,invite_code from csr_consumer where invite_count<(select coun ...
- Django之模型层第一篇:单表操作
Django之模型层第一篇:单表操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数 ...
- 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单
jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...
- 线性表->链式存储->线形链表(单链表)
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...
- MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)
一.单表查询 1.完整的语法顺序(可以不写完整,其次顺序要对) (不分组,且当前表使用聚合函数: 当前表为一组,显示统计结果 ) select distinct [*,查询字段1,查询字段2,表达式, ...
- [转]SpringMVC<from:form>表单标签和<input>表单标签简介
原文地址:https://blog.csdn.net/hp_yangpeng/article/details/51906654 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- ajax和servlet交互,表单日历插件,表单验证,form.js
我的index.jsp <body> <a>点我获取数据</a> <table border=1px> <tr> <td>ID& ...
- struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input
原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1 function dosearch() {2 if ($(&q ...
随机推荐
- python-将多个表格的信息合并到一个表格中
1.环境 代码运行环境:python3.7 相关的库:xlrd.xlwt 2.目的 通过xlrd库读取各个表格的数据,通过xlwt库将读取到的数据写入到一个表格中. 3.实现 在工程目录下,有一个te ...
- react组件通信 父组件与子组件互相通信
父组件将自己的状态传递给子组件,子组件当做属性来接收,当父组件更改自己状态的时候,子组件接收到的属性就会发生改变 父组件利用ref对子组件做标记,通过调用子组件的方法以更改子组件的状态,也可以调用子组 ...
- react生命周期比较常用的几个
import React, { Component } from 'react' // 只有在类组件中才有生命周期 export default class App extends Component ...
- Task2 -- 关于Lecture3
Smiling & Weeping ---- 玲珑骰子安红豆, 入骨相思知不知. 1. 学习Git分支管理: Git分支是灵活开发的关键.创建.切换和合并分支是基础操作.使用如下命令: bas ...
- tar命令 --null -T 参数详解
tar 命令的 --null 和 -T 参数可以一起使用,以从 null 设备读取文件名,并将这些文件名传递给 tar 命令来处理. --null 参数的作用是将文件名作为 null 字符分隔的字符串 ...
- iOS从UI内存地址到读取成员变量(oc/swift)
开发调试时,我们发现bug时常首先是从UI显示发现异常,下一步才会去定位UI相关连的数据的.XCode有给我们提供一系列debug工具,但是很多人可能还没有形成一套稳定的调试流程,因此本文尝试解决这个 ...
- php不使用Office包实现上万条数据导出表格
经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白. 要是使用office包目前后台内 ...
- Spark Structured Streaming(一)基础
1. 流处理的场景 我们在定义流处理时,会认为它处理的是对无止境的数据集的增量处理.不过对于这个定义来说,很难去与一些实际场景关联起来.在我们讨论流处理的优点与缺点时,先介绍一下流处理的常用场景. 通 ...
- .NET 中使用RabbitMQ初体验
在.NET Core中使用RabbitMQ 前言 逛园子的时候看到一篇.NET 学习RabbitMq的文章(视频地址和文章地址放在文章底部了),写的不错,我也来实现一下. 我是把RabbitMQ放在服 ...
- 汇总:"undefined reference to" 问题解决方法
背景 在Linux下编程容易出现的现象,就是在链接多文件的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于undefin ...