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

页面刷新后出现TypeError: oModel.responseJSON未定义问题求助

问题根源与解决方案

这个错误的核心原因是你把jQuery的$.ajax()返回的Deferred对象直接当成了同步的响应结果来用,完全忽略了AJAX请求的异步特性。

  • $.ajax()不会立即返回请求的响应数据,它返回的是一个Deferred(Promise)对象,只有当请求成功完成后,这个对象才会被填充responseJSON这类响应相关的属性。
  • 页面的onload事件触发时,你的AJAX请求大概率还在后台和服务器交互,此时oModel.responseJSON还未被赋值,自然会抛出undefined的错误。而后来你在控制台能拿到值,是因为此时请求已经完成,对象属性已经被填充了。

最优修正方案

你需要把displayEntries的调用放到AJAX请求的成功回调里,彻底抛弃依赖body的onload事件的逻辑,同时还要修复代码里的小笔误(比如拼接的变量html被写成了txt):

修正后的user.js代码:

'use strict'; // 保留严格模式
$.ajax({
  url: 'data.php',
  dataType: 'json'
}).done(function(response) {
  // 请求成功后再调用渲染函数
  displayEntries(response.results);
});

function displayEntries(entries) {
  $("#div").empty();
  jQuery.each(entries, function(i, entry) {
    let html = '<div id="cid-' + i + '" class="entry">' + entry.name + '</div>';
    $("#div").append(html); // 修正之前的变量名错误
  });
}

同时记得把body标签里的onload="displayEntries(oModel.responseJSON.results);"删掉,现在我们已经通过AJAX的回调来触发页面渲染了。

备选方案(不推荐)

如果你一定要保留onload的触发逻辑,可以通过轮询等待AJAX完成,但这种方式不够优雅,仅作参考:

'use strict';
let responseData;
$.ajax({
  url: 'data.php',
  dataType: 'json'
}).done(function(response) {
  responseData = response;
});

function displayEntries() {
  if (!responseData) {
    // 请求未完成,延迟100ms重试
    setTimeout(displayEntries, 100);
    return;
  }
  $("#div").empty();
  jQuery.each(responseData.results, function(i, entry) {
    let html = '<div id="cid-' + i + '" class="entry">' + entry.name + '</div>';
    $("#div").append(html);
  });
}

对应的body标签改成onload="displayEntries();"即可,但还是优先推荐第一种回调方案,逻辑更清晰、性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:51