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

Ajax请求重复触发求助:getScreenSize仅调用一次却多次请求set_screen_size.php

排查AJAX请求随机重复执行的问题

嘿,这个随机重复请求的问题确实挺闹心的,咱们一步步拆解可能的原因,再对应给出排查和解决办法:

最可能的元凶:窗口resize事件的高频触发

你提到getScreenSize()只被调用一次,但大概率是这个函数绑定在了窗口resize事件上——而浏览器在调整窗口尺寸时(比如拖动边缘),会连续触发几十次resize事件,哪怕你只是轻轻拖动一下。这就会导致函数被反复执行,AJAX请求自然也跟着重复发送了。

解决办法:给resize事件加防抖处理

防抖能让函数只在窗口停止调整一段时间后才执行,避免高频触发。修改你的代码试试:

// 定义防抖计时器
let resizeDebounceTimer;

function getScreenSize(w, h) {
  // 每次触发时先清除之前的计时器
  clearTimeout(resizeDebounceTimer);
  
  resizeDebounceTimer = setTimeout(() => {
    if (w != $(window).width() || h != $(window).height()) {
      w = $(window).width();
      h = $(window).height();
      $.ajax({
        url:"modules/set_screen_size.php",
        method:"POST",
        data:{ w:w, h:h },
        success:function(data) {
          if (data == "changed") {
            location.reload();
          }
        },
      });
    }
  }, 300); // 300ms延迟,可根据需求调整
}

其他可能的排查方向

1. 事件绑定重复

虽然你说页面只调用一次函数,但有可能:

  • 脚本被重复加载(比如HTML里多次引入同一个JS文件)
  • 动态渲染的内容或其他脚本重复绑定了resize事件

排查方式:打开浏览器开发者工具的「Event Listeners」面板,找到resize事件,查看绑定的回调数量,确认是否有重复绑定的情况。

2. 请求未加锁导致并发重复

如果函数执行速度快于AJAX请求响应,可能在第一个请求还没完成时,第二个请求就发出去了。可以加一个请求锁来避免:

let isRequestInProgress = false;

function getScreenSize(w, h) {
  // 如果已有请求在进行,直接返回
  if (isRequestInProgress) return;
  
  isRequestInProgress = true;
  
  if (w != $(window).width() || h != $(window).height()) {
    w = $(window).width();
    h = $(window).height();
    $.ajax({
      url:"modules/set_screen_size.php",
      method:"POST",
      data:{ w:w, h:h },
      success:function(data) {
        if (data == "changed") {
          location.reload();
        }
      },
      // 请求完成(无论成功失败)都释放锁
      complete:function() {
        isRequestInProgress = false;
      }
    });
  } else {
    isRequestInProgress = false;
  }
}

3. 页面刷新后的连锁触发

你的代码在返回changed时会执行location.reload(),刷新页面后getScreenSize()会再次执行。如果刷新过程中浏览器窗口尺寸发生了微小变化(比如页面加载时滚动条出现/消失),可能会再次触发AJAX请求,形成短暂的循环。

排查方式:可以在刷新前打印当前窗口尺寸,刷新后再对比,看是否有细微变化;或者临时注释掉location.reload(),观察请求是否还会重复。

4. 全局AJAX配置或插件的影响

检查是否有全局的AJAX设置(比如$.ajaxSetup())添加了自动重试逻辑,或者引入了类似jQuery.ajaxRetry这类自动重试的插件,导致请求失败时被重复发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:47:35