什么是表单呢?当前端想要提交数据给后端,怎么搞?那么在前端开发中,表单是常用的手段,比如常见的场景有:登录框、账号注册页、主机信息录入CMDB等等场景都是需要表单。那么在本篇中,笔者除了讲一些基本的知识点,还会再结合后端的方式来演示如何接收表单提交的数据。希望这些小小的演示可以起到抛砖引玉的效果。
构建表单,主要是通过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属性进行绑定呢。
什么是单选按钮?就是在多个选项中,你只能选其中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来实现需要使用单选按钮的场景。
什么是复选框?复选框就是可以选择多个选项,当需要多选的时候,使用复选框输入类型就对了。看下面代码:
<!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,这个是重点哦!
当有数据要提交给后端的时候怎么搞?如果后端是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"了吗?
在之前的例子中,前端表单需要将数据提交给后端,除了需要一个提交按钮外,还需要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属性的用法有了进一步的理解呢?
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,还结合了后端的一丢丢知识,前端和后端的知识点以后都会慢慢讲到哈!
先来个前端代码:
<!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语言”,并提交
后端啥也没干,就只做了打印
前端代码:
<!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
者 | Mateusz Iwaniuk
译者 | 明明如月,责编 | 夕颜
出品 | CSDN(ID:CSDNnews)
文章配套代码: https://github.com/iwaniukooo11/email-sender
现在,即使是创建最基本的网站,程序员也必须使用现代的功能和技术。甚至像为你的朋友创建简单的投资组合这样的基本项目也可能涉及到一些问题,比如从联系人表单接收数据。有很多方法可以读取这些数据。你可以将表单与数据库连接起来,然后从数据库中读取传入的消息来实现功能,但这样做会给不懂技术的客户造成困难。
你为什么不通过发送电子邮件传输信息?
不使用数据库就能接收到传入的消息,绝对是最佳选择,也是最方便用户的选择。但问题来了—如何实现呢?你可能认为需要使用某种后端语言。
实际上,你不必使用任何如 php 或 python 这种后端语言,你甚至不需要用到 node.js!你需要的就是一个简单的EmailJS 库。
本文将介绍下面两个重要功能:
配置 emailjs 帐户
使用 JS 发送电子邮件
请注意,在我的项目中,我使用了 gulp 和 webpack,我在 src 文件夹存放源码,dist 存放最终发布版本的代码。
我将分 5 个步骤向你展示如何从头开始构建电子邮件发送器。
步骤1-用 HTML 创建表单
首先需要创建一个 HTML 表单。你不必放置像 required 或 max 这种验证属性,因为稍后,preventDefault 函数将在你的提交事件上运行,它会让这些属性的处理失效。
表单中最重要的是为每个输入放置 name 属性,后面会用到。
我的非常简单的表单是这样的:
src/html/index.html
<form class="form">
<input name='name' type="text" placeholder="Your name..." class="form__input" />
<input name='topic' type="text" placeholder="Topic..." class="form__input" />
<textarea name='message' type="text" placeholder="Your Message..." class="form__input" ></textarea>
<input type="submit" value="send" class="form__input form__input--button">
</form>
步骤2-注册成为 email 用户
要配置你的电子邮件,你必须注册电子邮件服务。别担心—使用这个网站非常方便和省时。
登入后,系统会询问你的电子邮件服务,它位于个人电子邮件服务区(personal email service)。在我的例子中,我选择了 gmail。
然后,你需要连接你的 gmail 帐户。这将用来发送电子邮件给你客户。例如,如果你关联了 xyz@gmail.com 账户,你后续发送的邮件都将从这个邮箱发出。所以不要担心“ Send email on your behalf” 这个授权信息—这正是你需要的!
连接完 gmail 账户后,点击添加服务(add service)按钮。
步骤3-创建邮件模板
如果你已经成功连接了你的 gmail 账户,你现在应该在信息中心中。现在需要创建电子邮件模板了。
切换到电子邮件模板卡,并单击创建一个新的模板(create a new template)。界面非常友好,所以创建模板不会有任何问题。
你可以选择模板的名称和 ID。我称之为“我的神奇模板(my_amazing_template)”。
接下来,你必须指定邮件的内容。
模板的变量值来自 input 中的 `name` 属性。你已将变量插入`{{{}}}`符号中。
不要忘记在“收件人”部分 (右侧) 添加电子邮件地址。你的电子邮件将被发送到该电子邮件地址上。截图中的收件人邮箱是我自己的公司邮箱。
这是我的简单模板,它使用来自 HTML 表单里的 3 个变量。我还指定了接收电子邮件的主题。
步骤4-保存 API 密钥
这部分没什么特别的。Emailjs 共享授权 API 密钥,将在发送电子邮件时使用。当然,放这些钥匙最好的地方是`.env` 配置。但是因为我使用的是简单的静态文件,我不想使用服务器配置,所以我将它们保存在 apikeys 文件中,然后再将它们导入。
你的 USER_ID 位于 Account > API Keys 菜单下。
TEMPLATE_ID 位于模板的标题下面。
这是我基于不存在的 keyssrc / js / apikeys. js 的示例配置.
src/js/apikeys.js
export default {
USER_ID :'user_DPUd-rest-of-my-id',
TEMPLATE_ID:'my_amazing_template'
}
如果需要将源码发布到 GITHUB,不要忘记将 APIKEYS 文件添加到 .GITIGNORE文件中
现在是该项目最后也是最重要的部分的了。现在我们必须使用 javascript 发送电子邮件。
首先,你必须下载 emailjs 包。
npm i emails-com
然后,转到 js 文件,导入库和 apikeys。
src/js/main.js
import emailjs from 'emailjs-com'
import apiKeys from './apikeys'
现在是编写发送电子邮件功能的时候了
src/js/main.js
const sendEmail = e => {
e.preventDefault
emailjs
.sendForm('gmail', apiKeys.TEMPLATE_ID, e.target, apiKeys.USER_ID)
.then(
result => {
console.log(result.text)
},
error => {
console.log(error.text)
}
)
}
sendForm 函数有4个参数:
你的电子邮件的 ID,在这里:
TEMPLATE_ID 来自 apikey 文件,
事件对象来自你的表单提交
USER_ID 来自 apikey 文件,
最后,查找表单并添加提交事件监听器:
src/js/main.js
const form = document.querySelector('.form')
form.addEventListener('submit',sendEmail)
正如我前面提到的,由于 `preventDefault` 函数,属性验证将无法工作。你必须使用 JS 自己进行验证和清除输入。
以上就是全部内容,接下来让我们测试一下。
填写页面上的表单并发送。
我收到电子邮件,内容正是根据我们的模板和表单数据渲染出来的。
通过上图可以看出,所有的变量的值都填充到了正确的位置上。
通过本文的介绍你会发现用 JS 发送邮件并非难事。
使用 emailjs,你可以简单的方式发送电子邮件。
我相信你未来的用户会很高兴收到来自他们网页上表单填写数据的t邮件,相信本文对你有帮助。
这篇文章的配套代码在这里: https://github.com/iwaniukooo11/email-sender
原文链接:
https://dev.to/iwaniukooo11/send-e-mails-directly-from-front-end-with-js-5d7d
本文为CSDN翻译文章,转载请注明出处。
☞我们想研发一个机器学习框架,6 个月后失败了
☞生产型机器学习已经没那么困难了?
☞视频 | 你不知道的"开源"60年秘史
☞GitHub标星10,000+,Apache项目ShardingSphere的开源之路
☞阿里技术专家告诉你,如何画出优秀的架构图?
☞加拿大API平台如何做到30%为中国明星项目?创业老兵这样说……
页编程之表单详解。
同学们好,今天我要跟大家分享的是html中前后台数据交互的重要内容——form标签。通过form标签,用户可以在前台填写资料,然后通过form的method属性中设置的提交方式,提交至action属性规定的后端处理程序中进行处理。
我们经常在网页上看到的填写、注册、登录、修改资料等操作都需要使用form标签。让我们来看看今天的实例效果吧。
form标签对于用户来说是不可见的,如果没有这一句话,你们只能看到一个完全空白的网页。
可以将form标签想象成一个盒子,其中放置了输入框、单选框、复选框等控件。当用户填写完所有控件的内容并点击提交按钮时,这个盒子就会被盖上,并被直接发送到服务器进行处理。
接下来,我们来看看实现代码。form标签是一个围堵标签,它具有许多属性,但并非所有属性都是必需的。因此,根据需要设置相应的属性即可。
首先,我要重点介绍几个常用的属性:action、name、method。
action属性设置了服务端处理程序的URL地址。以邮寄盒子的理解来说,action就是收件人地址。
name属性设置了表单的名称,这个名称可以被前台的JS调用。同时,在一个网页中存在多个表单标签时,它也可以用来给服务器进行区分。
method属性设置了表单的提交方式,它有两个值post和get。post是密文,而get是明文,post没有数据长度限制,而get只能传递大约3000个字符。
以邮寄举例,get是直接将写着内容的信纸寄出,而post则是将信纸装进信封里寄出。enctype不是常用属性,但在使用时非常重要。它规定了从表单数据发送到服务器之前如何对其进行编码,共有三个值,分别对应文字数据、多媒体数据和文件数据。详情请参考汇总文档。值得一提的是,只有在method等于post时,enctype的值才会生效。
除了这三个属性外,还有accept-charset、autocomplete和history。accept-charset声明了服务端可以处理的字符集,autocomplete是否开启前台自动填充历史数据及用户填写一次之后,再填写会在浏览器中询问是否根据过往填写的内容进行自动填充。
·将logo的"novalidate"设置为"true",可以直接提交未经验证的表单数据。通常,我们需要在前台使用JS或控件验证用户填写的数据是否符合格式要求。然而,这个属性可以直接绕过验证。
·将"target"设置为"_blank",可以打开新的窗口进行提交。这与a标签的"target"属性相同。现在,我的理解是这样的。在后面的C#章节中,我们将结合具体的使用场景进行详细的讲解。
今天的分享就到这里。希望各位同学能按照我的要求,认真练习写三次。这样,即使不看视频,你们也能写出正确的代码。所有的案例和相关文档都可以向我索取。我们下期再见。网页编程、服务端编程、数据库和算法。如果你想学习编程,记得关注我哦!
*请认真填写需求信息,我们会在24小时内与您取得联系。