表单提交数据与FormData

表单提交数据

一般情况下,我们表单提交数据是使用表单submit按钮进行提交

<form action="demo.php" method="post">
        <input type="text" name="username" placeholder="请输入用户名" id="username">
        <input type="password" name="password" placeholder="请输入密码" id="pwd">
        <input type="text" name="email" placeholder="请输入邮箱" id="email">
        <input type="text" name="phone" placeholder="请输入手机号码" id="phone">
        <input type="submit" value="提交">
    </form>

在后端我们使用PHP模拟

<?php
header("Content-Type:text/html;charsert=utf-8");
$_POST["username"];
$_POST["password"];
$_POST["email"];
$_POST["phone"];
echo $_POST["username"].$_POST["password"].$_POST["email"].$_POST["phone"];

在html页面中输入如下内容点击提交按钮后
在这里插入图片描述
在这里插入图片描述
会在php页面打印php得到的内容。这种方法是比较基础的数据提交的方式。但是其缺点就是会跳转页面,当我们点击提交后页面就会跳转到php页面,此方法对表单的依赖也比较强。因此,在学习了ajax之后就可以用ajax发送请求提交数据。

ajax提交数据

 <form action="">
        <input type="text" name="username" placeholder="请输入用户名" id="username">
        <input type="password" name="password" placeholder="请输入密码" id="pwd">
        <input type="text" name="email" placeholder="请输入邮箱" id="email">
        <input type="text" name="phone" placeholder="请输入手机号码" id="phone">
        <input type="button" value="提交" id="btn">
    </form>
$("#btn").click(function() {
        $.post({
            url: "demo.php",
            dataType: "json",
            data: {
                username: $("#username").val(),
                password: $("#pwd").val(),
                email: $("#email").val(),
                phone: $("#phone").val()
            },
            success: function(obj) {
                console.log(obj);
            }

        })
    })
<?php
header("Content-Type:text/html;charset=utf-8");
echo json_encode($_POST["username"].$_POST["password"].$_POST["email"].$_POST["phone"]);

当我点击提交按钮后使用ajaz请求发送数据,数据在控制台打印
在这里插入图片描述
并且页面还在html页面中,使用ajax不会跳转页面,并且还可以人为的控制提交数据的时机。这是在传递非文件类型数据的时候的处理方式,那么在传递文件类型的数据又如何处理呢。

ajax传递文件

是否还是向之前传递数据一样呢,我们来试一下

<form action="">
        <input type="text" name="username" placeholder="请输入用户名" id="username">
        <input type="password" name="password" placeholder="请输入密码" id="pwd">
        <input type="text" name="email" placeholder="请输入邮箱" id="email">
        <input type="text" name="phone" placeholder="请输入手机号码" id="phone">
        <input type="file" name="file" id="file">
        <input type="button" value="提交" id="btn">
    </form>
<?php
header("Content-Type:text/html;charset=utf-8");
echo json_encode($_FILES("file").$_POST["username"].$_POST["password"].$_POST["email"].$_POST["phone"]);
$("#btn").click(function() {
        $.post({
            url: "demo.php",
            dataType: "json",
            data: {
                username: $("#username").val(),
                password: $("#pwd").val(),
                email: $("#email").val(),
                phone: $("#phone").val(),
                file: $("#file").val()
            },
            success: function(obj) {
                console.log(obj);
            }

        })
    })

在这里插入图片描述
然而当我们点击提交按钮后
在这里插入图片描述
并没有结果,因此,这种方法不行。
那么,什么方法行呢。我们可以使用FormData对象来传递数据。

FromData

FormData提供了一种表示表单数据的键值对 key/value 的构造方式,也就是说,它可以帮我们将表单数据用键值对来表示,不需要我们自己手动传递。接下来,我们来试一下。

$("#btn").click(function() {
        var fm = new FormData($("form")[0]);
        $.post({
            url: "demo.php",
            dataType: "json",
            data: fm,
            processData: false,
            contentType: false,
            success: function(obj) {
                console.log(obj);
            }

        })
    })

在这里插入图片描述当我们点击提交按钮之后,我们可以看到控制台的输出,是可以看到file的,那么FormData的这种方式就可以解决ajax传递文件的问题,同时也为我们传递其他数据提供了一种更方便的方法。
在这里插入图片描述
由此我们便总结一下,formdata的使用流程

  1. 创建一个FormData的实例对象
 var fm = new FormData($("form")[0]);

构造函数的参数是一个DOM对象并且form元素。
2. 将实例对象对象作为数据传递过去
3. 要设置procsssData和contentType为false,这样jQuery就不会再额外添加请求头和拼接数据了。
以上是jQuery的步骤,那么原声js又是什么情况呢
代码如下

 document.getElementById("btn").onclick = function() {
            var xhr = new XMLHttpRequest();
            xhr.open("post", "demo.php");
            var form = document.getElementsByTagName("form")[0];
            var fm = new FormData(form);
            xhr.send(fm);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    console.log(xhr.responseText);
                }
            }
        }

效果如下
在这里插入图片描述
由此可见,FormData的确是一种很方便的提交数据的一种方法,但是我们也发现了,以上都是提交的form内的表单控件的数据,那么如果我们想提交非表单控件的值的时候怎么办呢。接下来就需要介绍一个FormData的一个实例方法,该方法可以让我们提交表单控件的值以外的值。

append

append,就是我们要介绍的FormData的实例方法。从字面我们就可以知道该方法是用来追加数据的,那么怎么样呢。

var fm  =new FormData(document.getElemjentsByTagName("form")[0]);
fm.append("key","value");

既然FormData是一种键值对的构造方式,那么很明显数据是通过键值对的形式传递的。
该方法的参数有两个
参数1:属性名,也就是要提交的数据的名称
参数2:属性值,就是具体的值
接下来,我们试一下

 document.getElementById("btn").onclick = function() {
            var xhr = new XMLHttpRequest();
            xhr.open("post", "demo.php");
            var form = document.getElementsByTagName("form")[0];
            var fm = new FormData(form);
            fm.append("addr", "湖北省");
            xhr.send(fm);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    console.log(xhr.responseText);
                }
            }
        }

在这里插入图片描述

表单序列化

除了上面的方法外,jQuery的表单序列化也可以帮我们更方面的提交数据。表单序列化就是将表单中弄得数据拼接成键值对形式的字符串,也就是试用ajax发送数据传入的参数字符串形式。

$("#btn").click(function() {
        console.log($("form").serialize());
    })

效果如下,这就是表单序列化之后的格式,可以直接作为数据提交,比较方便。
在这里插入图片描述

由此可见,我们的数据的确是提交过去了,以上便是提交数据的方法。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值