You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测用户取消页面加载?解决表单加载弹窗残留问题

解决浏览器取消加载按钮导致加载动画残留的问题

这个问题确实挺棘手的——浏览器的取消加载按钮并没有提供直接的DOM事件让我们监听,但我们可以通过几个间接的方式来处理这个场景,避免加载动画一直显示:

方案一:利用页面导航状态间接判断(适合传统表单提交)

当用户点击提交按钮触发页面跳转后,如果点击浏览器的取消加载,浏览器会中止导航并回到当前页面。我们可以通过监听页面的pageshow事件结合状态标记来识别这个场景:

let isNavigating = false;

// 提交按钮触发时显示加载动画并标记导航状态
$("#submitButton").submit(function(e) {
  $("#loadingBox").css('display', 'block');
  isNavigating = true;
});

// 监听页面卸载前事件,确认导航状态
window.addEventListener('beforeunload', function() {
  isNavigating = true;
});

// 页面重新显示时(包括导航被取消回到当前页)隐藏加载动画
window.addEventListener('pageshow', function(event) {
  if (event.persisted || isNavigating) {
    $("#loadingBox").css('display', 'none');
    isNavigating = false;
  }
});

// 保留你原来的Esc键处理逻辑
$(document).keydown(function (e) {
  if(e.keyCode == 27) {
    $("#loadingBox").css('display', 'none');
  }
});

event.persisted用于判断页面是否是从浏览器缓存中恢复的(比如用户点击后退/取消导航时的情况),结合我们手动设置的isNavigating标记,就能覆盖用户取消加载的场景。

方案二:改用AJAX提交表单(更可控的方案)

如果可以修改表单的提交方式,改用AJAX提交会让我们对请求状态有完全的控制权,包括监听请求被中止的事件:

$("#submitButton").submit(function(e) {
  // 阻止默认的页面重载提交
  e.preventDefault();
  
  $("#loadingBox").css('display', 'block');
  
  // 发起AJAX请求
  const request = $.ajax({
    url: this.action,
    method: this.method,
    data: $(this).serialize()
  });

  // 请求完成(成功/失败)后隐藏动画
  request.always(function() {
    $("#loadingBox").css('display', 'none');
  });

  // 监听请求被中止的事件(包括用户点击浏览器取消按钮、Esc键等)
  request.abort(function() {
    $("#loadingBox").css('display', 'none');
  });
});

这种方式不仅能完美解决取消加载的问题,还能避免页面重载,提升用户体验——用户不需要等待整个页面刷新,只需要等待请求完成后更新页面内容即可。

为什么直接监听取消按钮不可行?

浏览器的取消加载按钮属于浏览器的原生UI组件,并没有暴露对应的JavaScript事件或状态属性给网页开发者,所以我们只能通过页面导航、请求状态这类间接的信号来判断用户是否取消了加载。

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

火山引擎 最新活动