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
相关产品推荐
相关产品推荐

