You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax表单提交成功回调触发html2pdf、空表单拦截实现求助

实现方案

1. 表单校验失败阻止提交

你现有的validateContact校验逻辑已经覆盖了空值、邮箱格式校验,只要补充两个细节即可完全实现阻止提交的逻辑:

  • 若你是通过<form>标签的提交事件触发请求,需要阻止表单默认提交行为
  • 修复原代码中AJAX参数的笔误:把$(content).val()改为$("#content").val()

2. 提交完成后调用html2pdf

把现有html2pdf逻辑封装为独立函数,在AJAX请求的success回调中触发即可,如果你还需要保留原有的点击按钮下载PDF的功能,也可以同时保留按钮点击事件绑定。


修改后完整代码

// 表单提交函数
function sendContact(e) {
    // 若为form标签的submit事件触发,阻止默认表单跳转提交
    e && e.preventDefault();

    var valid = validateContact();
    if(valid) {
        jQuery.ajax({
            url: "contact_mail.php",
            data:'userName='+$("#userName").val()+'&userEmail='+$("#userEmail").val()+'&subject='+$("#subject").val()+'&content='+$("#content").val(),
            type: "POST",
            success:function(data){
                $("#mail-status").html(data);
                // 表单提交成功后触发PDF生成
                generatePDF();
            },
            error:function (){
                $("#mail-status").html("提交失败,请重试");
            }
        });
    }
}

// 原有表单校验逻辑无需改动
function validateContact() {
    var valid = true;   
    $(".demoInputBox").css('background-color','');
    $(".info").html('');

    if(!$("#userName").val()) {
        $("#userName-info").html("(required)");
        $("#userName").css('background-color','#FFFFDF');
        valid = false;
    }
    if(!$("#userEmail").val()) {
        $("#userEmail-info").html("(required)");
        $("#userEmail").css('background-color','#FFFFDF');
        valid = false;
    }
    if(!$("#userEmail").val().match(/^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/)) {
        $("#userEmail-info").html("(invalid)");
        $("#userEmail").css('background-color','#FFFFDF');
        valid = false;
    }
    if(!$("#subject").val()) {
        $("#subject-info").html("(required)");
        $("#subject").css('background-color','#FFFFDF');
        valid = false;
    }
    if(!$("#content").val()) {
        $("#content-info").html("(required)");
        $("#content").css('background-color','#FFFFDF');
        valid = false;
    }

    return valid;
}

// 封装后的PDF生成函数
function generatePDF() {
    const invoice = document.getElementById("invoice");
    var opt = {
        margin: 0,
        filename: 'myfile.pdf',
        image: { type: 'jpeg', quality: 0.98 },
        html2canvas: { scale: 1 },
        jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }
    };
    html2pdf().from(invoice).set(opt).save();
}

// 保留原有点击按钮下载PDF的功能(不需要可以删除这段)
document.getElementById("download").addEventListener("click", generatePDF);

事件绑定参考

  • 按钮触发提交:
<button type="button" onclick="sendContact()">提交表单</button>
  • form标签绑定提交:
<form onsubmit="sendContact(event)">
<!-- 表单输入项 -->
</form>

可选优化:如果需要确认服务端处理成功后再生成PDF,可让后端返回JSON格式的结果,前端判断状态后再触发PDF生成即可,避免提交失败也生成PDF的问题。

内容的提问来源于stack exchange,提问作者Nikola

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:54:04