整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端數(shù)據(jù)提交給后端之HTML表單簡(jiǎn)單剖析

          在開(kāi)篇

          什么是表單呢?當(dāng)前端想要提交數(shù)據(jù)給后端,怎么搞?那么在前端開(kāi)發(fā)中,表單是常用的手段,比如常見(jiàn)的場(chǎng)景有:登錄框、賬號(hào)注冊(cè)頁(yè)、主機(jī)信息錄入CMDB等等場(chǎng)景都是需要表單。那么在本篇中,筆者除了講一些基本的知識(shí)點(diǎn),還會(huì)再結(jié)合后端的方式來(lái)演示如何接收表單提交的數(shù)據(jù)。希望這些小小的演示可以起到拋磚引玉的效果。

          盤(pán)點(diǎn)HTML表單基礎(chǔ)

          1. from元素

          構(gòu)建表單,主要是通過(guò)from元素,我們先來(lái)一個(gè)最簡(jiǎn)單的小栗子,看下面代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>主機(jī)信息錄入CMDB</h3>
                  <form>
                      <label for="hostname">主機(jī)名:</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屬性,下面我們來(lái)總結(jié)下:

          類型描述text文本輸入radio單選按鈕checkbox提交按鈕submit提交按鈕button可單擊按鈕

          在上面小栗子中,除了input元素之外,不知道大家注意label元素沒(méi)有。label元素的主要用途是為input元素定義標(biāo)簽,且用for屬性和input元素的id屬性進(jìn)行綁定呢。

          2. 單選按鈕

          什么是單選按鈕?就是在多個(gè)選項(xiàng)中,你只能選其中1個(gè),不能多選。下面我們看個(gè)小栗子,看下面代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>問(wèn)答題1(單選):某站長(zhǎng),工作經(jīng)驗(yàn)不足1年,僅從互聯(lián)網(wǎng)收集學(xué)習(xí)資料制定學(xué)習(xí)路線售賣(mài)盈利,從道德層面角度分析是否有問(wèn)題?</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">沒(méi)有</label>
                      <input type="radio" id="i3" name="problem" value="not_clear">
                      <label for="i3">不清楚</label>
                  </form>
                  <h3>問(wèn)答題2(單選):實(shí)際工作經(jīng)驗(yàn)不足1年的人員折騰的學(xué)習(xí)資料您覺(jué)得是否對(duì)你有幫助?</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">沒(méi)有</label>
                      <input type="radio" id="w3" name="problem" value="not_clear">
                      <label for="w3">不清楚</label>
                  </form>
              </body>
          </html>
          

          效果如下圖:

          上面的小栗子中,出了兩道問(wèn)答題,均為單選題。那么,類似的需求都是可以使用輸入類型為radio來(lái)實(shí)現(xiàn)需要使用單選按鈕的場(chǎng)景。

          3. 復(fù)選框

          什么是復(fù)選框?復(fù)選框就是可以選擇多個(gè)選項(xiàng),當(dāng)需要多選的時(shí)候,使用復(fù)選框輸入類型就對(duì)了。看下面代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>問(wèn)答題1(單選):某站長(zhǎng),工作經(jīng)驗(yàn)不足1年,僅從互聯(lián)網(wǎng)收集學(xué)習(xí)資料制定學(xué)習(xí)路線售賣(mài)盈利,從道德層面角度分析是否有問(wèn)題?</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">沒(méi)有</label>
                      <input type="checkbox" id="i3" name="problem" value="not_clear">
                      <label for="i3">不清楚</label><br>
                      <input type="submit" value="提交">
                  </form>
                  <h3>問(wèn)答題2(單選):實(shí)際工作經(jīng)驗(yàn)不足1年的人員折騰的學(xué)習(xí)資料您覺(jué)得是否對(duì)你有幫助?</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">沒(méi)有</label>
                      <input type="checkbox" id="w3" name="problem" value="not_clear">
                      <label for="w3">不清楚</label><br>
                      <input type="submit" value="提交">
                  </form>
              </body>
          </html>
          

          效果如下圖:

          上面的小栗子中,實(shí)現(xiàn)復(fù)選框的輸入類型是checkbox,這個(gè)是重點(diǎn)哦!

          4. 提交按鈕

          當(dāng)有數(shù)據(jù)要提交給后端的時(shí)候怎么搞?如果后端是API服務(wù),可以給它提交json。如果是前端頁(yè)面,就需要通過(guò)構(gòu)建表單來(lái)獲取用戶的輸入。基于表單提交數(shù)據(jù)給后端,怎么提交?需要一個(gè)可以點(diǎn)擊的提交按鈕,那這個(gè)按鈕怎么來(lái)?先看下面代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>主機(jī)信息</h3>
                  <form>
                      <label for="ipaddr">IP地址</label>
                      <input type="text" id="ipaddr" name="ip"><br>
                      <input type="submit" value="提交">
                  </form>
              </body>
          </html>
          

          效果如下圖:

          輸入類型為submit,說(shuō)明它就是提交按鈕,注意上面代碼type="submit"了嗎?

          HTML表單重要屬性

          1. Action屬性

          在之前的例子中,前端表單需要將數(shù)據(jù)提交給后端,除了需要一個(gè)提交按鈕外,還需要action屬性。當(dāng)點(diǎn)擊提交按鈕后,表單的數(shù)據(jù)該發(fā)到后端的哪個(gè)url進(jìn)行處理,就是定義在action屬性中。接下來(lái),我們結(jié)合前端和后端直接來(lái)個(gè)小實(shí)戰(zhàn),后端代碼用Python的Flask框架。

          前端代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>主機(jī)信息</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)
          

          前端和后端的代碼寫(xiě)完后,我們接下來(lái)看看效果

          輸入IP地址后,點(diǎn)擊提交

          這個(gè)ok是后端返回的

          后端接收到數(shù)據(jù)后,啥也沒(méi)做,只是做了簡(jiǎn)單打印

          這個(gè)小栗子很簡(jiǎn)單,通過(guò)這個(gè)小栗子,是不是對(duì)action屬性的用法有了進(jìn)一步的理解呢?

          2. Method屬性

          method屬性的用途是指定提交數(shù)據(jù)的http方法,通常有2個(gè),get和post。接下來(lái)我們?cè)谏蟼€(gè)小栗子的基礎(chǔ)上做個(gè)小改造,看下面代碼

          前端代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>主機(jī)信息</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)
          

          當(dāng)前端輸入數(shù)據(jù)后,提交表單時(shí),直接告訴你這是不允許的方法

          在這個(gè)例子中,是因?yàn)榍岸说谋韱瘟酥付薽ethod為get請(qǐng)求,而后端接收數(shù)據(jù)的method規(guī)定了需要post請(qǐng)求,故所以出現(xiàn)這個(gè)問(wèn)題。

          下面我們改造一下后端代碼:

          # 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 '提交數(shù)據(jù)需要post請(qǐng)求'
          
          if __name__ == '__main__':
          
              webapp.run(host="0.0.0.0", port=8088, debug=True)
          

          前端表單中的method還是保持get請(qǐng)求,再次提交,后端的返回如下:

          看到了嗎?后端判斷前端過(guò)來(lái)的請(qǐng)求是get還是post,很顯然,前端過(guò)來(lái)的請(qǐng)求是get,并且返回了非常友好的提示。

          接下來(lái)我們繼續(xù)改造一下前端的代碼,將請(qǐng)求修改為post,代碼如下:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <h3>主機(jī)信息</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>
          

          后端代碼也稍微改造一下,改變接收前端數(shù)據(jù)的方法

          # 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 '提交數(shù)據(jù)需要post請(qǐng)求'
          
          if __name__ == '__main__':
          
              webapp.run(host="0.0.0.0", port=8088, debug=True)
          

          輸入IP地址,并點(diǎn)擊提交

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

          接下來(lái)看下后端,后端啥也沒(méi)做,就獲取到表單的數(shù)據(jù),然后打印了數(shù)據(jù),并且打印了下數(shù)據(jù)類型

          好了,關(guān)于前端的action屬性和Method屬性就講到這里了。為了講解action和method,還結(jié)合了后端的一丟丟知識(shí),前端和后端的知識(shí)點(diǎn)以后都會(huì)慢慢講到哈!

          HTML表單常用元素

          1. 下拉列表

          先來(lái)個(gè)前端代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="post">
                      <label for="opslist">運(yùn)維開(kāi)發(fā)應(yīng)掌握的技能:</label>
                      <select id="opslist" name="opslist">
                          <option value="python">Python語(yǔ)言</option>
                          <option value="go">Go語(yǔ)言</option>
                          <option value="shell">Shell語(yǔ)言</option>
                          <option value="database">數(shù)據(jù)庫(kù)</option>
                          <option value="frontend">前端</option>
                          <option value="linux">Linux</option>
                          <option value="network">網(wǎng)絡(luò)</option>
                          <option value="storage">存儲(chǔ)</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 '提交數(shù)據(jù)需要post請(qǐng)求'
          
          if __name__ == '__main__':
          
              webapp.run(host="0.0.0.0", port=8088, debug=True)
          

          在下拉框中選擇“Go語(yǔ)言”,并提交

          后端啥也沒(méi)干,就只做了打印

          2. 允許多選

          前端代碼:

          <!DOCTYPE html>
          <html lang="zh">
              <head>
                  <meta charset="UTF-8">
                  <title>彩虹運(yùn)維技術(shù)棧社區(qū)主頁(yè)</title>
              </head>
              <body>
                  <h2>彩虹運(yùn)維技術(shù)棧社區(qū),公眾號(hào)ID:TtrOpsStack</h2>
                  <form action="http://192.168.11.10:8088/ttropsstack" target="_blank" method="post">
                      <label for="opslist">運(yùn)維開(kāi)發(fā)應(yīng)掌握的技能:</label>
                      <select id="opslist" name="opslist" size="6" multiple>
                          <option value="python">Python語(yǔ)言</option>
                          <option value="go">Go語(yǔ)言</option>
                          <option value="shell">Shell語(yǔ)言</option>
                          <option value="database">數(shù)據(jù)庫(kù)</option>
                          <option value="frontend">前端</option>
                          <option value="linux">Linux</option>
                          <option value="network">網(wǎng)絡(luò)</option>
                          <option value="storage">存儲(chǔ)</option>
                      </select>
                      <input type="submit">
                  </form>
              </body>
          </html>
          

          上述前端代碼中,是使用multiple屬性來(lái)實(shí)現(xiàn)選擇多個(gè)值。

          后端代碼的打印方式稍微做了些許調(diào)整:

          # 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 '提交數(shù)據(jù)需要post請(qǐng)求'
          
          if __name__ == '__main__':
          
              webapp.run(host="0.0.0.0", port=8088, debug=True)
          

          按住ctrl或者shift鍵可進(jìn)行多選

          后端打印的效果圖下圖:

          寫(xiě)在最后

          關(guān)于表單基礎(chǔ)知識(shí)點(diǎn)的講解就這么愉快的結(jié)束了,關(guān)于更多表單的元素、輸入屬性、輸入類型可自行查閱和實(shí)戰(zhàn),筆者因時(shí)間有限就不一一演示。感謝您的閱讀,望多多關(guān)注我們、點(diǎn)贊、轉(zhuǎn)發(fā)!

          本文轉(zhuǎn)載于(喜歡的盆友關(guān)注我們):https://mp.weixin.qq.com/s/L-Msv39JrF7AzRx4K1OLjA

          者 | Mateusz Iwaniuk

          譯者 | 明明如月,責(zé)編 | 夕顏

          出品 | CSDN(ID:CSDNnews)

          文章配套代碼: https://github.com/iwaniukooo11/email-sender

          現(xiàn)在,即使是創(chuàng)建最基本的網(wǎng)站,程序員也必須使用現(xiàn)代的功能和技術(shù)。甚至像為你的朋友創(chuàng)建簡(jiǎn)單的投資組合這樣的基本項(xiàng)目也可能涉及到一些問(wèn)題,比如從聯(lián)系人表單接收數(shù)據(jù)。有很多方法可以讀取這些數(shù)據(jù)。你可以將表單與數(shù)據(jù)庫(kù)連接起來(lái),然后從數(shù)據(jù)庫(kù)中讀取傳入的消息來(lái)實(shí)現(xiàn)功能,但這樣做會(huì)給不懂技術(shù)的客戶造成困難。

          你為什么不通過(guò)發(fā)送電子郵件傳輸信息?

          不使用數(shù)據(jù)庫(kù)就能接收到傳入的消息,絕對(duì)是最佳選擇,也是最方便用戶的選擇。但問(wèn)題來(lái)了—如何實(shí)現(xiàn)呢?你可能認(rèn)為需要使用某種后端語(yǔ)言。

          實(shí)際上,你不必使用任何如 php 或 python 這種后端語(yǔ)言,你甚至不需要用到 node.js!你需要的就是一個(gè)簡(jiǎn)單的EmailJS 庫(kù)。

          本文將介紹下面兩個(gè)重要功能:

          • 配置 emailjs 帳戶

          • 使用 JS 發(fā)送電子郵件

          請(qǐng)注意,在我的項(xiàng)目中,我使用了 gulp 和 webpack,我在 src 文件夾存放源碼,dist 存放最終發(fā)布版本的代碼。

          我將分 5 個(gè)步驟向你展示如何從頭開(kāi)始構(gòu)建電子郵件發(fā)送器。

          步驟1-用 HTML 創(chuàng)建表單

          首先需要?jiǎng)?chuàng)建一個(gè) HTML 表單。你不必放置像 required 或 max 這種驗(yàn)證屬性,因?yàn)樯院螅琾reventDefault 函數(shù)將在你的提交事件上運(yùn)行,它會(huì)讓這些屬性的處理失效。

          表單中最重要的是為每個(gè)輸入放置 name 屬性,后面會(huì)用到。

          我的非常簡(jiǎn)單的表單是這樣的:

          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-注冊(cè)成為 email 用戶

          要配置你的電子郵件,你必須注冊(cè)電子郵件服務(wù)。別擔(dān)心—使用這個(gè)網(wǎng)站非常方便和省時(shí)。

          登入后,系統(tǒng)會(huì)詢問(wèn)你的電子郵件服務(wù),它位于個(gè)人電子郵件服務(wù)區(qū)(personal email service)。在我的例子中,我選擇了 gmail。

          然后,你需要連接你的 gmail 帳戶。這將用來(lái)發(fā)送電子郵件給你客戶。例如,如果你關(guān)聯(lián)了 xyz@gmail.com 賬戶,你后續(xù)發(fā)送的郵件都將從這個(gè)郵箱發(fā)出。所以不要擔(dān)心“ Send email on your behalf” 這個(gè)授權(quán)信息—這正是你需要的!

          連接完 gmail 賬戶后,點(diǎn)擊添加服務(wù)(add service)按鈕。

          步驟3-創(chuàng)建郵件模板

          如果你已經(jīng)成功連接了你的 gmail 賬戶,你現(xiàn)在應(yīng)該在信息中心中。現(xiàn)在需要?jiǎng)?chuàng)建電子郵件模板了。

          切換到電子郵件模板卡,并單擊創(chuàng)建一個(gè)新的模板(create a new template)。界面非常友好,所以創(chuàng)建模板不會(huì)有任何問(wèn)題。

          你可以選擇模板的名稱和 ID。我稱之為“我的神奇模板(my_amazing_template)”。

          接下來(lái),你必須指定郵件的內(nèi)容。

          模板的變量值來(lái)自 input 中的 `name` 屬性。你已將變量插入`{{{}}}`符號(hào)中。

          不要忘記在“收件人”部分 (右側(cè)) 添加電子郵件地址。你的電子郵件將被發(fā)送到該電子郵件地址上。截圖中的收件人郵箱是我自己的公司郵箱。

          這是我的簡(jiǎn)單模板,它使用來(lái)自 HTML 表單里的 3 個(gè)變量。我還指定了接收電子郵件的主題。

          步驟4-保存 API 密鑰

          這部分沒(méi)什么特別的。Emailjs 共享授權(quán) API 密鑰,將在發(fā)送電子郵件時(shí)使用。當(dāng)然,放這些鑰匙最好的地方是`.env` 配置。但是因?yàn)槲沂褂玫氖呛?jiǎn)單的靜態(tài)文件,我不想使用服務(wù)器配置,所以我將它們保存在 apikeys 文件中,然后再將它們導(dǎo)入。

          你的 USER_ID 位于 Account > API Keys 菜單下。

          TEMPLATE_ID 位于模板的標(biāo)題下面。

          這是我基于不存在的 keyssrc / js / apikeys. js 的示例配置.

          src/js/apikeys.js

          export default { USER_ID :'user_DPUd-rest-of-my-id', TEMPLATE_ID:'my_amazing_template'}

          如果需要將源碼發(fā)布到 GITHUB,不要忘記將 APIKEYS 文件添加到 .GITIGNORE文件中

          步驟5-發(fā)送電子郵件

          現(xiàn)在是該項(xiàng)目最后也是最重要的部分的了。現(xiàn)在我們必須使用 javascript 發(fā)送電子郵件。

          首先,你必須下載 emailjs 包。

          npm i emails-com

          然后,轉(zhuǎn)到 js 文件,導(dǎo)入庫(kù)和 apikeys。

          src/js/main.js

          import emailjs from 'emailjs-com'import apiKeys from './apikeys'

          現(xiàn)在是編寫(xiě)發(fā)送電子郵件功能的時(shí)候了

          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 函數(shù)有4個(gè)參數(shù):

          你的電子郵件的 ID,在這里:

          TEMPLATE_ID 來(lái)自 apikey 文件,

          事件對(duì)象來(lái)自你的表單提交

          USER_ID 來(lái)自 apikey 文件,

          最后,查找表單并添加提交事件監(jiān)聽(tīng)器:

          src/js/main.js

          const form = document.querySelector('.form')form.addEventListener('submit',sendEmail)

          正如我前面提到的,由于 `preventDefault` 函數(shù),屬性驗(yàn)證將無(wú)法工作。你必須使用 JS 自己進(jìn)行驗(yàn)證和清除輸入。

          以上就是全部?jī)?nèi)容,接下來(lái)讓我們測(cè)試一下。

          填寫(xiě)頁(yè)面上的表單并發(fā)送。

          我收到電子郵件,內(nèi)容正是根據(jù)我們的模板和表單數(shù)據(jù)渲染出來(lái)的。

          通過(guò)上圖可以看出,所有的變量的值都填充到了正確的位置上。

          總結(jié)

          通過(guò)本文的介紹你會(huì)發(fā)現(xiàn)用 JS 發(fā)送郵件并非難事。

          使用 emailjs,你可以簡(jiǎn)單的方式發(fā)送電子郵件。

          我相信你未來(lái)的用戶會(huì)很高興收到來(lái)自他們網(wǎng)頁(yè)上表單填寫(xiě)數(shù)據(jù)的t郵件,相信本文對(duì)你有幫助。

          這篇文章的配套代碼在這里: https://github.com/iwaniukooo11/email-sender

          原文鏈接:

          https://dev.to/iwaniukooo11/send-e-mails-directly-from-front-end-with-js-5d7d

          本文為CSDN翻譯文章,轉(zhuǎn)載請(qǐng)注明出處。

          ?我們想研發(fā)一個(gè)機(jī)器學(xué)習(xí)框架,6 個(gè)月后失敗了

          ?生產(chǎn)型機(jī)器學(xué)習(xí)已經(jīng)沒(méi)那么困難了?

          ?視頻 | 你不知道的"開(kāi)源"60年秘史

          ?GitHub標(biāo)星10,000+,Apache項(xiàng)目ShardingSphere的開(kāi)源之路

          ?阿里技術(shù)專家告訴你,如何畫(huà)出優(yōu)秀的架構(gòu)圖?

          ?加拿大API平臺(tái)如何做到30%為中國(guó)明星項(xiàng)目?創(chuàng)業(yè)老兵這樣說(shuō)……

          頁(yè)編程之表單詳解。

          同學(xué)們好,今天我要跟大家分享的是html中前后臺(tái)數(shù)據(jù)交互的重要內(nèi)容——form標(biāo)簽。通過(guò)form標(biāo)簽,用戶可以在前臺(tái)填寫(xiě)資料,然后通過(guò)form的method屬性中設(shè)置的提交方式,提交至action屬性規(guī)定的后端處理程序中進(jìn)行處理。

          我們經(jīng)常在網(wǎng)頁(yè)上看到的填寫(xiě)、注冊(cè)、登錄、修改資料等操作都需要使用form標(biāo)簽。讓我們來(lái)看看今天的實(shí)例效果吧。

          form標(biāo)簽對(duì)于用戶來(lái)說(shuō)是不可見(jiàn)的,如果沒(méi)有這一句話,你們只能看到一個(gè)完全空白的網(wǎng)頁(yè)。

          可以將form標(biāo)簽想象成一個(gè)盒子,其中放置了輸入框、單選框、復(fù)選框等控件。當(dāng)用戶填寫(xiě)完所有控件的內(nèi)容并點(diǎn)擊提交按鈕時(shí),這個(gè)盒子就會(huì)被蓋上,并被直接發(fā)送到服務(wù)器進(jìn)行處理。

          接下來(lái),我們來(lái)看看實(shí)現(xiàn)代碼。form標(biāo)簽是一個(gè)圍堵標(biāo)簽,它具有許多屬性,但并非所有屬性都是必需的。因此,根據(jù)需要設(shè)置相應(yīng)的屬性即可。

          首先,我要重點(diǎn)介紹幾個(gè)常用的屬性:action、name、method。

          action屬性設(shè)置了服務(wù)端處理程序的URL地址。以郵寄盒子的理解來(lái)說(shuō),action就是收件人地址。

          name屬性設(shè)置了表單的名稱,這個(gè)名稱可以被前臺(tái)的JS調(diào)用。同時(shí),在一個(gè)網(wǎng)頁(yè)中存在多個(gè)表單標(biāo)簽時(shí),它也可以用來(lái)給服務(wù)器進(jìn)行區(qū)分。

          method屬性設(shè)置了表單的提交方式,它有兩個(gè)值post和get。post是密文,而get是明文,post沒(méi)有數(shù)據(jù)長(zhǎng)度限制,而get只能傳遞大約3000個(gè)字符。

          以郵寄舉例,get是直接將寫(xiě)著內(nèi)容的信紙寄出,而post則是將信紙裝進(jìn)信封里寄出。enctype不是常用屬性,但在使用時(shí)非常重要。它規(guī)定了從表單數(shù)據(jù)發(fā)送到服務(wù)器之前如何對(duì)其進(jìn)行編碼,共有三個(gè)值,分別對(duì)應(yīng)文字?jǐn)?shù)據(jù)、多媒體數(shù)據(jù)和文件數(shù)據(jù)。詳情請(qǐng)參考匯總文檔。值得一提的是,只有在method等于post時(shí),enctype的值才會(huì)生效。

          除了這三個(gè)屬性外,還有accept-charset、autocomplete和history。accept-charset聲明了服務(wù)端可以處理的字符集,autocomplete是否開(kāi)啟前臺(tái)自動(dòng)填充歷史數(shù)據(jù)及用戶填寫(xiě)一次之后,再填寫(xiě)會(huì)在瀏覽器中詢問(wèn)是否根據(jù)過(guò)往填寫(xiě)的內(nèi)容進(jìn)行自動(dòng)填充。

          ·將logo的"novalidate"設(shè)置為"true",可以直接提交未經(jīng)驗(yàn)證的表單數(shù)據(jù)。通常,我們需要在前臺(tái)使用JS或控件驗(yàn)證用戶填寫(xiě)的數(shù)據(jù)是否符合格式要求。然而,這個(gè)屬性可以直接繞過(guò)驗(yàn)證。

          ·將"target"設(shè)置為"_blank",可以打開(kāi)新的窗口進(jìn)行提交。這與a標(biāo)簽的"target"屬性相同。現(xiàn)在,我的理解是這樣的。在后面的C#章節(jié)中,我們將結(jié)合具體的使用場(chǎng)景進(jìn)行詳細(xì)的講解。

          今天的分享就到這里。希望各位同學(xué)能按照我的要求,認(rèn)真練習(xí)寫(xiě)三次。這樣,即使不看視頻,你們也能寫(xiě)出正確的代碼。所有的案例和相關(guān)文檔都可以向我索取。我們下期再見(jiàn)。網(wǎng)頁(yè)編程、服務(wù)端編程、數(shù)據(jù)庫(kù)和算法。如果你想學(xué)習(xí)編程,記得關(guān)注我哦!


          主站蜘蛛池模板: 成人在线观看一区| 日韩一区二区三区精品| 国产乱码精品一区二区三区中| 国模吧一区二区三区| 人妻av综合天堂一区| 波多野结衣一区二区免费视频| 中文字幕人妻无码一区二区三区| 亚洲午夜精品一区二区公牛电影院| 一区二区亚洲精品精华液| 亚洲AV无码一区二三区| 日韩高清一区二区三区不卡| 亚洲无删减国产精品一区| 国产品无码一区二区三区在线蜜桃 | 日韩美一区二区三区| 国产电影一区二区| 亚洲av乱码一区二区三区按摩| 亚洲国产高清在线精品一区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲sm另类一区二区三区| 国偷自产av一区二区三区| 变态调教一区二区三区| 国产91精品一区二区麻豆亚洲| 丝袜美腿高跟呻吟高潮一区| 天堂一区二区三区在线观看| 国产一区二区视频免费| 亚州国产AV一区二区三区伊在| 国产免费一区二区三区免费视频 | 中文字幕一区二区三匹| 国产日韩综合一区二区性色AV| 国产三级一区二区三区| 一区二区不卡久久精品| 亚洲AV无码一区二区三区系列 | 少妇人妻精品一区二区三区| 99久久人妻精品免费一区| 免费高清av一区二区三区| 国产精品一区二区久久国产| 无码人妻精品一区二区三区99性 | 日韩精品电影一区亚洲| 色欲精品国产一区二区三区AV| 国产香蕉一区二区三区在线视频| 亚洲AⅤ无码一区二区三区在线 |