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

Ajax JavaScript中onprogress事件不触发问题排查求助

问题排查与解决方案

1. onprogress不生效的核心原因

你当前绑定的xhr.onprogress监听的是服务器响应返回的下载阶段进度,如果你的PHP接口返回的响应内容体积极小,这个事件要么只会触发一次,要么会和onload几乎同时触发,让你感知不到触发效果。
如果你想监听前端数据上传到服务器的进度,需要把事件绑定到xhr.upload对象上:

// 替换你原来的xhr.onprogress绑定为下面的代码
xhr.upload.onprogress = function(e) {
  console.log("appendChild");
  // 上传进度逻辑可以写在这里
};

2. 加载动画的最优实现方案

你的需求是提交请求后立刻显示spinner,完全不需要等待progress事件触发,直接在调用xhr.send()之前插入显示spinner的逻辑即可,这是最稳定的实现方式:

let s_form = document.querySelector("#con-form");

s_form.addEventListener("submit", (e) => {
  e.preventDefault();
  // 提前获取提交按钮,保存原始状态
  const submitBtn = s_form.querySelector('button[type="submit"]');
  const originBtnContent = submitBtn.innerHTML;
  // 直接在这里显示加载动画,不用等进度事件
  submitBtn.disabled = true;
  submitBtn.innerHTML = '<span class="spinner"></span> 提交中'; // 替换为你自己的spinner结构

  let name = document.getElementById("name").value;
  let email = document.getElementById("email").value;
  let mobno = document.getElementById("mobno").value;
  let concern = document.getElementById("concern").value;
  const xhr_obj = {
    name: name,
    email: email,
    mobno: mobno,
    concern: concern,
  };
  let data_send = JSON.stringify(xhr_obj);
  const xhr = new XMLHttpRequest();
  xhr.open("POST", "http://localhost/dc/utilities/php/h_f_s.php", true);
  xhr.setRequestHeader("Content-type", "application/json");
  xhr.onload = function () {
    console.log("loaded");
    // 请求完成后恢复按钮状态
    submitBtn.disabled = false;
    submitBtn.innerHTML = originBtnContent;
    // 其余你的业务逻辑
  };
  // 补充异常处理,避免请求失败时按钮一直处于加载状态
  xhr.onerror = xhr.onabort = function() {
    console.error("请求异常");
    submitBtn.disabled = false;
    submitBtn.innerHTML = originBtnContent;
  }
  xhr.send(data_send);
});

3. 补充说明

  • 如果提交的表单数据体积很小,上传进度事件只会触发一次,和直接在send前执行显示spinner的逻辑没有区别
  • 必须补充异常状态处理,覆盖请求失败、用户主动取消请求的场景,避免按钮一直处于禁用加载状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:15:04