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

AJAX异步行为探究:请求回调是否先于后续脚本执行?

问题解答

完全有可能出现这种情况,核心原因在于浏览器的事件循环机制和AJAX、$(document).ready()的执行时机差异:

  1. 执行顺序逻辑

    • 页面中的脚本会按照其在HTML中的加载顺序同步执行。第一段脚本发起AJAX请求后,浏览器会立即发送请求,同时继续执行后续代码(包括加载第二段脚本),无需等待响应。
    • 如果服务器响应极快(比如请求命中本地缓存、服务器处理耗时几乎为0),浏览器会把AJAX的回调函数加入到事件任务队列中等待执行。
    • 而$(document).ready()的回调是绑定到DOMContentLoaded事件的,这个事件要等到HTML解析完成、DOM树完全构建后才会触发,对应的回调才会被加入任务队列。
  2. 触发冲突场景
    假设你的代码结构是这样的:

    <head>
      <script src="jquery.js"></script>
      <script>
        // 第一段脚本:发起AJAX
        $.get("/Home/GetData", function(data) {
          // 尝试操作表格,但此时表格还未创建
          $("#data-table").html(data);
        });
      </script>
      <script>
        // 第二段脚本:在ready中创建表格
        $(document).ready(function() {
          $("body").append("<table id='data-table'></table>");
        });
      </script>
    </head>
    

    如果AJAX在DOM树构建完成前就收到响应,其回调会先于$(document).ready()的回调执行,此时目标表格还不存在,回调中的表格操作会无效。

  3. 解决方案

    • 调整请求时机:把AJAX请求放在$(document).ready()内部,确保表格创建完成后再发起请求:
      $(document).ready(function() {
        $("body").append("<table id='data-table'></table>");
        $.get("/Home/GetData", function(data) {
          $("#data-table").html(data);
        });
      });
      
    • 回调内校验DOM:在AJAX回调中先检查目标表格是否存在,若不存在则等待DOM加载完成后再执行操作:
      $.get("/Home/GetData", function(data) {
        $(document).ready(function() {
          $("#data-table").html(data);
        });
      });
      
    • 同步创建表格:如果不需要等待整个DOM就绪,直接把创建表格的代码放在AJAX请求之前且不包裹在$(document).ready()中,确保表格先于AJAX回调存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:26:02