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

使用AJAX/JavaScript实现联系表单无刷新提交后收到空邮件的问题修复咨询

解决AJAX提交表单后收到空邮件的问题

你的问题核心出在AJAX请求的内容格式不匹配,再加上一些事件监听和逻辑的小疏漏,我帮你一步步修正:

1. 修复AJAX的内容类型冲突

你手动设置了Content-type: application/x-www-form-urlencoded,但发送的是FormData对象——这两种格式不兼容,导致PHP无法正确解析POST数据,所以收到的都是空值。

有两种解决方案:

方案一:移除手动设置的Content-Type头

当发送FormData时,浏览器会自动添加正确的multipart/form-data请求头,不需要手动指定:

// 删掉这一行代码
// xhr.setRequestHeader('Content-type', "application/x-www-form-urlencoded");

方案二:将FormData转换为urlencoded格式

如果你坚持要用application/x-www-form-urlencoded格式,可以用URLSearchParams转换:

let data = new URLSearchParams(new FormData(formData));

2. 优化事件监听的精准度

你现在监听的是整个document的submit事件,容易误触发页面上的其他表单。建议直接绑定到你的联系表单上:

3. 修正错误处理逻辑

原来的代码在请求还未完成(readyState≠4)时就会显示错误信息,这不符合逻辑——应该只有在请求完成后,再根据状态码判断结果。

修正后的完整AJAX代码

document.addEventListener('DOMContentLoaded', function() {
  const contactForm = document.getElementById('contact-form');
  contactForm.addEventListener("submit", function(e) {
    e.preventDefault();
    let data = new FormData(this); // 用this指代当前表单,写法更简洁
    const xhr = new XMLHttpRequest();
    
    xhr.open('POST', "contactform.php", true);
    // 移除手动设置的Content-Type,让浏览器自动处理
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4) { // 仅当请求完成时再判断状态
        if (xhr.status == 200) {
          contactForm.reset();
          document.querySelector('.response').innerHTML = '<p class="alert alert-success">Bedankt voor uw bericht. Wij nemen zo snel mogelijk contact met u op.</p>';
        } else {
          document.querySelector('.response').innerHTML = '<p class="alert alert-danger">Er is iets misgegaan.</p>';
        }
      }
    };
    xhr.send(data);
  });
});

额外:PHP代码的小问题

你的PHP里$from变量没有定义,会导致邮件头出错,建议补充定义:

// 在设置$header之前添加
$from = $email; // 使用用户填写的邮箱作为发件人
$header = "From:" . $from . "\r\n";

这样修改后,PHP就能正确接收AJAX发送的表单数据,你就能收到完整内容的邮件了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:37:27