前端表单验证与Ajax提交:防止无效数据提交的实用指南


前端表单验证与ajax提交:防止无效数据提交的实用指南

前端表单验证是Web开发中至关重要的一环。它不仅能提升用户体验,避免用户提交无效数据,还能减轻服务器压力,确保数据的有效性和安全性。本文将介绍如何使用J*aScript进行前端验证,并在验证失败时阻止表单提交,以及如何利用Ajax实现无刷新提交。

前端验证:onsubmit事件的正确使用

原问题中,表单的onsubmit事件绑定了一个validate()函数,期望在验证失败时阻止表单提交。然而,即使验证失败,表单仍然提交到了collect-dsrs-attendance-confirmation.php。这是因为validate()函数中存在逻辑问题,导致返回值不正确。

问题分析:

原代码中的validate()函数存在几个问题:

  1. var file = document.getElementById("user_img"); 获取的是 元素,但后续的错误信息显示区域display_error,代码中并没有定义。
  2. J*aScript中,函数如果没有明确的return语句,默认返回undefined。return valid;写在else语句块外面,导致无论验证结果如何,都会执行该语句,影响了验证结果。
  3. 错误信息没有正确显示,因为没有找到id为file_error的元素。

解决方案:

以下是修改后的validate()函数,并添加了错误信息显示区域:

<div class="row">
    <div class="col-12 col-md-12 col-sm-6">
        <!-- Attendacne Card Info Fields-->
        <div class="card">
            <div class="card-body">
                <!--<h4 class="card-title mb-5">DSR Information Fields</h4>-->
                <form action="./collect-dsrs-attendance-confirmation.php" method="POST" name="page331" enctype="multipart/form-data" onsubmit="return validate();">
                    <div class="form-body">
                        <div class="row">
                            <input type="text" class="form-control"  id="lat" name="latitude" style="display:none;" value="">
                            <input type="text" class="form-control"  id="long" name="longitude" style="display:none;" value="">
                            <!--Back Button For Each Page-->
                            <div class="col-md-12 mb-5 d-grid gap-2 d-md-flex justify-content-md-end">
                                <div class="form-actions text-start mt-3">
                                    <a type="button" href="./index.php" class="btn btn-danger ps-4 pe-4"
                                    id="backhome" style="background-color: rgb(255, 0, 0);">Back Home</a>
                                </div>
                            </div>   

                            <div class="col-lg-12 col-md-12">
                                <div class="form-group mb-3">
                                        <label class="form-label text-dark" for="dsrELNumber">ইএল নম্বর</label>
                                        <div class="input-group">
                                            <div class="input-group-prepend">
                                                <span class="input-group-text" id="basic-addon1">+880</span>
                                            </div>
                                            <input class="form-control" id="dsrELNumber" type="text" name="el_number" id="elNumber" 
                                            placeholder="Enter EL Number"  data-maxlength="10" data-minlength="10"
                                            oninput="this.value=this.value.slice(0,this.dataset.maxlength)"
                                            value="<?php if(!empty($_POST['dsr_el_number'])) echo $_POST['el_number']; ?>" required>
                                        </div>
                                        <div id="docImage">
                                            <!--<video id="video" width="640" height="480" autoplay style="display:none;"></video>-->
                                            <label class="custom-file-label text-primary mt-3" for="file-input">Take Selfie</label>
                                            <input type="file" class="mt-4 form-control" id="user_img" name="user_img" accept="image/*" capture="camera" required>
                                            <button class="btn text-white mt-4 mb-4 d-block ps-4 pe-4" type="submit" style="background-color: rgb(255, 0, 0);" id="btnTakeDocument">Submit</button>
                                        </div>
                                         <!--Error Message-->
                                         <div id="file_error" style="color:red;"></div>

                                     <!--To show successfull message-->
                                     <div id="message"></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <!-- Attendacne Card Info Fields-->
    </div>
</div>
<script>
    function validate() {
        var valid = true;
        var file_name = "";
        var file_type = "";
        var file_size = "";
        var error_msg = "";
        var valid_size = 3 * 1000 * 1000;
        var display_error = document.getElementById('file_error');
        var file = document.getElementById("user_img");

        if (file.files.length != 0) {
            file_name = file.files[0].name;
            file_size = file.files[0].size;
            file_type = file.files[0].type;

            if (file_type != "image/png" && file_type != "image/jpeg" && file_type != "image/gif") {
                valid = false;
                error_msg = error_msg + "\n* Only 'PNG', 'JPG/JPEG' and 'GIF' file type supported.";
            }

            if (file_size > valid_size) {
                valid = false;
                error_msg = error_msg + "\n* Filesize should be upto 3MB.";
            }

        } else {
            valid = false;
            error_msg = error_msg + "\n* Please select any image file.";
        }


        if (valid == true) {
            alert("File pass all validation. Now it is ready to send.");
            /*Write ajax code here to send file to the server.*/
            return true;
        } else {
            display_error.innerHTML = error_msg;
            return false;
        }
    }
</script>

关键点:

  • 错误信息显示区域: 在HTML中添加 ,用于显示错误信息。
  • 正确的return语句: 确保return true;和return false;在正确的条件分支中执行。

使用Ajax进行无刷新提交

虽然前端验证可以阻止大部分无效提交,但仍然可以通过绕过前端验证的方式提交数据。因此,结合后端验证是最佳实践。此外,使用Ajax可以实现无刷新提交,提升用户体验。

示例代码:

Facetune Facetune

一款在线照片和视频编辑工具,允许用户创建AI头像

Facetune 109 查看详情 Facetune

首先,移除表单的onsubmit事件,并添加一个按钮的点击事件监听器:

<form action="./collect-dsrs-attendance-confirmation.php" method="POST" name="page331" enctype="multipart/form-data">
    ...
    <button class="btn text-white mt-4 mb-4 d-block ps-4 pe-4" type="button" style="background-color: rgb(255, 0, 0);" id="btnTakeDocument">Submit</button>
    ...
</form>

然后,使用jQuery编写Ajax代码:

$(document).ready(function() {
    $("#btnTakeDocument").click(function(e) {
        e.preventDefault(); // 阻止默认的表单提交

        if (!validate()) {
            return; // 如果验证失败,则不提交
        }

        var formData = new FormData($('form[name="page331"]')[0]); // 使用FormData对象处理文件上传

        $.ajax({
            type: "POST",
            url: "./collect-dsrs-attendance-confirmation.php",
            data: formData,
            contentType: false, // 必须设置为false
            processData: false, // 必须设置为false
            success: function(response) {
                // 处理服务器返回的响应
                $("#message").html(response); // 将响应显示在id为message的div中
                alert("提交成功!");
            },
            error: function(xhr, status, error) {
                // 处理错误
                alert("提交失败:" + error);
            }
        });
    });
});

关键点:

  • e.preventDefault();: 阻止默认的表单提交行为。
  • FormData对象: 用于处理包含文件上传的表单数据。
  • contentType: false和processData: false: 在使用FormData对象时,必须设置这两个选项为false。
  • 错误处理: 添加error回调函数,处理Ajax请求失败的情况。
  • jQuery引入: 确保页面引入了jQuery库。

后端验证:

在collect-dsrs-attendance-confirmation.php中,务必进行后端验证,确保数据的有效性和安全性。例如:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 验证EL Number
    if (!isset($_POST['el_number']) || !preg_match('/^\d{10}$/', $_POST['el_number'])) {
        echo "EL Number 格式错误!";
        exit;
    }

    // 验证文件上传
    if (!isset($_FILES['user_img']) || $_FILES['user_img']['error'] !== UPLOAD_ERR_OK) {
        echo "请选择上传的图片!";
        exit;
    }

    $file_name = $_FILES['user_img']['name'];
    $file_size = $_FILES['user_img']['size'];
    $file_type = $_FILES['user_img']['type'];
    $file_tmp_name = $_FILES['user_img']['tmp_name'];

    if ($file_type != "image/png" && $file_type != "image/jpeg" && $file_type != "image/gif") {
        echo "只支持 PNG、JPG/JPEG 和 GIF 格式的图片!";
        exit;
    }

    if ($file_size > 3 * 1024 * 1024) {
        echo "图片大小不能超过 3MB!";
        exit;
    }

    // 将文件移动到指定目录
    $upload_dir = "uploads/";
    $target_file = $upload_dir . basename($file_name);

    if (move_uploaded_file($file_tmp_name, $target_file)) {
        echo "文件上传成功!";
    } else {
        echo "文件上传失败!";
    }
}
?>

总结:

通过结合前端验证和Ajax提交,可以有效防止无效数据提交,提升用户体验,并减轻服务器压力。前端验证可以快速反馈错误,而Ajax提交可以实现无刷新体验。同时,务必进行后端验证,确保数据的有效性和安全性。

以上就是前端表单验证与Ajax提交:防止无效数据提交的实用指南的详细内容,更多请关注php中文网其它相关文章!


# 自定义  # 宁波抖音seo推荐  # 阳泉网络网站推广公司  # 黄埔高端网站建设  # 手机网站建设商标报价表  # seo域名选择策略  # 抖音优化seo方案  # 推广网站广告语  # 网站建设管理办法最新  # 贵州seo优化商家  # 五一酒店推广营销文案  # 的是  # 编辑器  # 设置为  # 可以实现  # 文件上传  # php  # 回调  # 错误信息  # 表单  # 表单提  # 点击事件  # 后端  # 回调函数  # ajax  # git  # 前端  # html  # jquery  # java  # javascript 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 服装短视频如何起号推广?服装短视频起号推广有什么要求?  汽水音乐车机版 汽水音乐车机版官方入口  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  J*aScript实现下拉菜单驱动的动态表格数据展示  在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程  如何查找哪个composer包引入了特定的依赖?  《环球网校》设置报考省市方法  全球各国上班时间表外贸邮件时间  德邦快递会员怎么开通  Keras中Convolution2D层及其核心辅助层详解  Composer如何使用composer-plugin-api开发自定义插件  CSS如何控制元素外边距_margin实现布局间隔  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  iSpring三分屏制作教程  MongoDB聚合管道:高效统计列表中各项的文档数量  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  b站怎么用微信登录_b站微信登录方法  Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频  微博网页版入口链接 微博网页版在线互动平台  《荔枝fm》导出文件教程  视频号视频怎么提取文案?提取的文案如何优化与使用?  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  小红书网页版在线直达 小红书网页版免费登录入口  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  mysql中如何配置字符集和排序规则_mysql字符集排序配置  C++ switch case字符串_C++如何实现字符串switch匹配  j*a中ArrayBlockingQueue的使用  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  响应式设计中动态背景颜色条的实现指南  《律学法考》查看学习数据方法  《全民k歌》网页版最新登录入口一览  CSS布局中意外顶部空白的调试与解决:深入理解padding-top  嘀嗒顺风车如何开具电子发票  Dash应用多值文本输入处理与类型转换教程  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  WooCommerce购物车:强制显示所有交叉销售商品教程  抖音猜你想搜能说明对方搜过吗  《虎扑》关闭社区内容推荐方法  Golang如何操作指针参数_Go pointer参数传递规则  歌词怎么展示在|直播|间视频号?有什么注意事项?  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  TikTok网页版入口快速访问 TikTok官网账号登录方法  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】 

 2025-10-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.