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

Codeigniter中AJAX返回JSON但无法触发success函数问题求助

排查CodeIgniter AJAX请求success不执行且页面直接显示JSON的问题

我来帮你一步步排查这个问题,这种情况通常是几个常见的细节没处理好导致的,咱们逐个分析:

1. 服务器端未正确设置JSON响应头

虽然你说接口返回了JSON格式的内容,但如果CodeIgniter的控制器方法没有设置正确的Content-Type响应头,jQuery会无法识别返回的是JSON,进而跳过success回调(甚至触发error回调,如果你没写的话就没任何反应)。

解决方法:在你的departments控制器方法里,一定要先设置响应头,再输出JSON内容:

public function departments() {
    // 生成要返回的HTML内容(第三个参数设为TRUE,返回字符串而非直接输出)
    $html_content = $this->load->view('path/to/your/template', $your_data, TRUE);
    
    // 设置响应头为JSON类型
    $this->output->set_content_type('application/json');
    
    // 输出合法的JSON对象,把HTML放在字段里
    echo json_encode([
        'html' => $html_content
    ]);
    exit; // 确保后续没有其他输出破坏JSON结构
}

2. AJAX请求触发时未阻止默认页面跳转

如果你的load_category()是通过点击链接、按钮(绑定了表单提交)触发的,很可能浏览器会执行默认的页面跳转行为,直接访问/admin/departments接口,导致页面显示JSON内容,而AJAX请求根本没正常发起。

解决方法:在触发AJAX的地方阻止默认行为,比如:

function load_category() {
    // 阻止默认的页面跳转/表单提交行为
    event.preventDefault();
    
    $.ajax({
        url: '/admin/departments',
        type: 'GET',
        dataType: 'json',
        success: function(response) {
            // 确认success执行了,可以先加日志排查
            console.log('请求成功,返回数据:', response);
            // 渲染到目标tbody
            $('#category-row').html(response.html);
        },
        // 一定要加error回调,方便排查问题
        error: function(xhr, status, error) {
            console.error('AJAX请求出错:', status, error);
            console.log('服务器返回内容:', xhr.responseText);
        }
    });
}

如果是通过链接触发,也可以在onclick里返回false:

<a href="/admin/departments" onclick="load_category(); return false;">加载分类</a>

3. 返回的JSON格式存在语法错误

HTML内容里可能包含未转义的特殊字符(比如双引号、换行符、单引号),如果手动拼接JSON而不是用json_encode(),很容易导致JSON结构损坏,jQuery解析失败,success就不会执行。

一定要用json_encode()生成JSON,它会自动转义所有特殊字符。另外,你可以打开浏览器开发者工具(F12)→「Network」标签,找到这个AJAX请求,查看「Response」内容,把它复制到浏览器控制台里用JSON.parse(返回内容)测试,看是否能正常解析。

4. 目标元素选择器错误或元素不存在

检查页面中是否真的存在id="category-row"的tbody元素,有没有拼写错误(比如写成category-rows)。可以在success回调里先打印日志,确认回调是否执行,再验证选择器是否正确:

success: function(response) {
    console.log('success触发了');
    console.log('目标元素是否存在:', $('#category-row').length); // 输出1表示存在,0表示不存在
    $('#category-row').html(response.html);
}

5. 服务器端路由/权限问题

确认CodeIgniter的路由是否正确指向了你的控制器方法,比如routes.php里是否有类似:

$route['admin/departments'] = 'AdminController/departments';

另外,如果这个接口需要登录权限,AJAX请求是否携带了会话Cookie?如果服务器返回了登录页面的HTML而非JSON,也会导致解析失败。可以查看Network里的请求状态码,是否是200,有没有403/401等错误。

最后建议

打开浏览器开发者工具,重点查看这几个地方:

  • 「Network」标签:确认请求是XHR类型(而非普通文档请求),查看响应头的Content-Type是否为application/json,查看响应内容是否是合法的JSON。
  • 「Console」标签:查看是否有JS报错,以及error回调里打印的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:15