Form 表单提交知识的总结(全)

前言: html 中的form元素被称之为表单,form元素中的内容,包含有交互控制元件,其目的是用来向web 服务器提交信息,实现前后端的交互目的。相关基础内容参照form基础知识文档 ,文章将会启动一个node 后台服务器,对前端form 表单的各种场景以及后端对请求结果的响应做一个归纳总结

1. node服务提供请求地址

   我们通过express 来启动后台服务,并且模拟两个后台接口

const express = require('express')
const app = express()
const bodyParser = require('body-parser')

// 处理请求 的content-type 为application/json
app.use(bodyParser.json())

//处理请求的content-type 为application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
  extended: false
}))
app.get('/user', (req, res) => {
  console.log(req.query)
  res.send('成功接收')
})


app.post('/user', (req, res) => {
  console.log(req.body)
  res.send('成功接收')
})
app.listen(3008, () => {
  console.log('服务启动')
})

2. 普通的form 表单提交

  form 表单通过method 的属性来确定提交给后台的请求方式,两者的基本用法如下

<!-- form 表单post提交,默认会刷新到 action 页面 -->
    <form action="http://localhost:3008/user" method="POST" name="post提交">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <input type="submit" value="提交">
    </form>
    
<!-- form 表单get 提交, 默认刷新action 页面 -->
    <form action="http://localhost:3008/user" method="GET" name="get提交">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <input type="submit" value="提交">
    </form>

以下几点需要特别注意

  1. form 的提交行为需要通过type=submit实现
  2. form 中的method 属性不指定时, form 默认的提交方式为 get请求。
  3. form 表单的提交后会有默认行为,会跳转刷新到action 的页面
  4. form 表单的提交方式,==请求头默认的content-type 为 x-www-form-urlencoded==
  5. 当一个form 表单内部,所有的input 中只有一个 type='text' 的时候,enter 键会有默认的提交行为(注意前提条件)。

3. 阻止新页面跳转

从前面可以知道,form 表单的提交会伴随着跳转到action中指定 的url 链接,为了阻止这一行为,可以通过设置一个隐藏的iframe 页面,并将form 的target 属性指向这个iframe,当前页面iframe则不会刷新页面

<!-- 无刷新页面提交 -->
    <form action="http://localhost:3008/user" method="POST" name="post提交" target="targetIfr">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <input type="submit" value="提交">
    </form>
    <iframe name="targetIfr" style="display:none"></iframe>

4. 脚本触发form 表单的提交行为

js事件触发表单提交,通过button、链接等触发事件,js调用submit()方法提交表单数据,jquery通过submit()方法

<!-- html -->
<!-- 通过js 进行表单的提交 存在问题,页面会跳转刷新-->
    <form action="http://localhost:3008/user" method="POST" name="jsForm" target="targetIfr" id="jsForm">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <button id="btn">提交</button>
    </form>

    <!-- 通过jquery 进行表单的提交 存在问题,并阻止页面跳转刷新-->
    <form action="http://localhost:3008/user" method="POST" name="jqueryForm" target="targetIfr" id="jqueryForm">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <button id="jqbtn">提交</button>
    </form>
// js
var btn = document.getElementById('btn')
var jsForm = document.getElementById('jsForm')
btn.onclick = function () {
    jsForm.submit()
}
// jquery
$('#jqbtn').click(function () {
  $('#jqueryForm').submit(function () {
    console.log('submit success')
    return false
  })
})

说明:

  1. 通过脚本提交行为依然存在跳转 新页面刷新的问题
  2. 脚本中可以通过阻止默认行为来禁止页面跳转

5. ajax 提交请求

<!-- ajax 请求 -->
    <form method="POST">
      <p>name: <input type="text" name="username"></p>
      <p>password: <input type="password" name="password"></p>
      <div id="jqbtn">提交</div>
    </form>
 $('#jqbtn').click(function () {
      $.ajax({
        url: 'http://localhost:3008/user',
        type: 'POST',
        data: JSON.stringify(params),
        contentType: "application/json", // 默认以formdata形式发送给后台
        dataType: "json",
        success: function (res) {
          console.log(res)
        }
      })
    })

注意事项:

  1. 通过ajax 请求模拟form 的提交需要注意 form 表单内 不允许 <button type="submit"></button>的存在,否则会和ajax 自身的请求相冲突
  2. ajax 请求中,默认的content-type 为'formdata',可根据自己的需要修改
  3. 后台对不同的content-type 请求头的处理如下
// 处理请求 的content-type 为application/json
app.use(bodyParser.json())

//处理请求的content-type 为application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
  extended: false
}))
  1. ajax 请求需要处理跨域问题,而form 表单的默认提交不需要,原因是,==原页面用form 提交到另一个域名之后,原脚本无法获取响应的内容,所以浏览器认为这是安全的,而ajax 需要处理响应的内容,浏览器则认为这是一种跨域的行为==
  2. 为了解决ajax 的跨域问题,需要在后台的代码中加入跨域的处理
const cors = require("cors")
// 解决跨域
app.use(cors())

6. FormData 处理文件的上传

文件的上传,请求头中content-type 的形式需要修改为multipart/form-data, 相应的,只要将form的enctype 属性修改为enctype="multipart/form-data"即可

<!-- FormData -->
    <form action="http://localhost:3008/user" method="POST" enctype="multipart/form-data">
      <p><input type="file" name="file"></p>
      <input type="submit" value="提交">
    </form>

后台处理部分,我们需要额外安装formidable 依赖来解决form-data 格式的解析

const formidable = require('formidable')

const form = new formidable.IncomingForm();

app.post('/user', (req, res) => {
  form.parse(req, function (err, fields, files) {
    console.log(files)
    res.send('成功接收')

  })
})

7.总结

form 表单前后端的处理汇总如上,详细的代码可以参考 github

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

推荐阅读更多精彩内容