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

CRM集成聊天应用中Ajax调用无法从控制器返回HTML的问题

问题排查与解决方案:Ajax加载聊天记录异常

嗨,我帮你梳理下这个问题的核心原因,其实是两个关键细节没处理好:

1. Ajax数据类型不匹配

你在Ajax里设置了dataType : "json",但你的控制器输出的是HTML字符串,不是JSON格式的数据。jQuery会尝试把响应内容解析成JSON,失败后就会触发error回调,这就是你看到“error fetching”的直接原因。

2. PHP变量名大小写错误

你在控制器里定义了$messagebody = $chat['message'];,但在HTML里输出的是<?=$messageBody;?>——PHP是区分大小写的,这两个是完全不同的变量,所以消息内容会输出空白,也可能导致页面渲染异常。

修正后的代码示例

调整Ajax的dataType

把dataType改成html,或者直接去掉(jQuery会自动识别响应类型):

function GetChatHistory(receiver_id){
 $.ajax({
 dataType : "html", // 改为HTML类型
 url: '/chat/get_chat_history_by_user',
 data:{receiver_id:receiver_id},
 success:function(data) {
 $('#chathistory').html(data);
 ScrollDown();
 },
 error: function (jqXHR, status, err) {
 console.log("错误信息:", status, err); // 用console.log更方便调试
 alert("error fetching")
 }
 });
}

修正控制器的变量名并优化输出

把$messageBody统一改成$messagebody,同时用输出缓冲确保只返回纯净的HTML内容:

public function get_chat_history_by_user(){
    // 开启输出缓冲,避免框架或其他代码输出多余内容
    ob_start();
    
    $receiver_id = $this->input->get('receiver_id');
    $Logged_sender_id = $this->session->userdata['user_id'];
    $history = $this->chat_model->GetReciverChatHistory($receiver_id);
    
    foreach($history as $chat):
        $sender_id = $chat['sender_id'];
        $userName = $this->UserModel->GetName($sender_id);
        $messagebody = $chat['message']; // 变量名保持小写
        $messagedatetime = date('d M H:i A',strtotime($chat['message_date_time']));
    ?>
        <?php if($Logged_sender_id != $sender_id): ?>
        <div class="direct-chat-msg">
            <div class="direct-chat-info clearfix">
                <span><?=$userName;?></span>
                <span><?=$messagedatetime;?></span>
            </div>
            <div class="direct-chat-text">
                <?=$messagebody;?> <!-- 和定义的变量名一致 -->
            </div>
        </div>
        <?php else: ?>
        <div class="direct-chat-msg right">
            <div class="direct-chat-info clearfix">
                <span><?=$userName;?></span>
                <span><?=$messagedatetime;?></span>
            </div>
            <div class="direct-chat-text">
                <?=$messagebody;?> <!-- 同样修正 -->
            </div>
        </div>
        <?php endif; ?>
    <?php endforeach;
    
    // 获取并输出缓冲的HTML内容
    $chat_html = ob_get_clean();
    echo $chat_html;
    exit; // 确保后续无多余输出
}

额外建议

  • 调试时可以把alert("error fetching")换成console.log(jqXHR.responseText),这样能直接看到控制器返回的内容,更容易定位问题。
  • 尽量保持PHP变量名的大小写一致,避免这类低级错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:37:36