如何在 AJAX 响应中正确渲染 HTML 字符串到 DOM 表格中

夏萱大大_7499

夏萱大大_7499

2026-03-17

714人浏览

原创

如何在 AJAX 响应中正确渲染 HTML 字符串到 DOM 表格中

本文详解为何 PHP 返回的含 HTML 字符串在 jQuery .html() 中显示为空,并提供完整解决方案:确保 JSON 序列化不破坏 HTML 内容、避免变量覆盖、正确设置响应头与前端解析逻辑。

本文详解为何 php 返回的含 html 字符串在 jquery `.html()` 中显示为空,并提供完整解决方案:确保 json 序列化不破坏 html 内容、避免变量覆盖、正确设置响应头与前端解析逻辑。

在使用 AJAX 动态更新表格内容时,一个常见却易被忽视的问题是:PHP 后端拼接的 HTML 字符串(如

...)经 json_encode() 返回后,在前端调用 $("#total_taxes").html(data.content_taxes) 时却渲染为空白——而其他纯文本或数值字段(如 sub_total_invoice)却能正常显示。根本原因往往不在前端逻辑,而在于 PHP 端 HTML 字符串未被安全、完整地嵌入 JSON 响应。

? 问题根源分析

从你提供的代码可见关键隐患:

$content_taxes = '<tr>...</tr><tr>...</tr>'; // ✅ HTML 字符串
$content_taxes = [    // ❌ 覆盖!同名变量被重定义为数组
    'status' => true,
    'content_taxes'=> $content_taxes, // 此处本应引用 HTML 字符串...
    // ...
];

表面看逻辑通顺,但若 $content_taxes 在赋值前已被声明为其他类型(如对象、已存在的数组),或存在作用域/编码污染(如输出缓冲、BOM 字符、未转义双引号),json_encode() 可能静默失败——此时 data.content_taxes 在浏览器中实际为 null 或空对象 {}(正如你控制台所见 "content_taxes":{}),导致 .html() 渲染空内容。

更深层风险:HTML 字符串中若含未转义的 "、 或 Unicode 特殊字符,json_encode() 默认行为可能截断或替换内容,尤其当未指定 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES 标志时。

✅ 正确实现方案

1. PHP 后端:分离变量 + 安全序列化

避免同名变量覆盖,显式命名 HTML 内容变量,并启用安全 JSON 编码:

// ✅ 清晰分离:HTML 内容使用独立变量名
$html_taxes = 
    <td>2</td>
    <td>VAT SuperReducted</td>
    <td class="text-right">4.00</td>
    <td class="text-right">140</td>
    <td class="text-right">5.6</td>

<tr>
<td>3</td>
    <td>VAT Reducted</td>
    <td class="text-right">10.00</td>
    <td class="text-right">0</td>
    <td class="text-right">0</td>
</tr><tr>
<td>4</td>
    <td>VAT General</td>
    <td class="text-right">21.00</td>
    <td class="text-right">1360</td>
    <td class="text-right">285.6</td>
</tr>
HTML;

$response = [
    'status'        => true,
    'content_taxes' => $html_taxes, // 直接赋值字符串
    'sub_total_invoice' => $total_invoice - $sub_total_taxes,
    'sub_total_taxes'   => $sub_total_taxes,
    'total_invoice'     => $total_invoice,
];

// ✅ 关键:设置响应头 + 完整 JSON 编码
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;

? 提示:JSON_UNESCAPED_UNICODE 防止中文等字符被 \uXXXX 转义;JSON_UNESCAPED_SLASHES 避免 HTML 中的 / 被转义为 \/,提升可读性与兼容性。

2. 前端 AJAX:增强错误处理与调试

在 success 回调中加入基础校验,并利用 console.log 快速定位问题:

$.ajax({
    method: "POST",
    url: "/invoices/calculate_totals",
    data: {
        "_token": '{{ csrf_token() }}',
        "parameters": data_inputs,
    },
    dataType: "json",
    success: function(data) {
        // ? 调试:始终先检查响应结构
        console.log("AJAX Response:", data);

        if (data.status !== true) {
            console.error("Server error:", data.message || "Unknown error");
            return;
        }

        // ✅ 安全渲染:检查 content_taxes 是否为非空字符串
        const htmlContent = data.content_taxes;
        if (typeof htmlContent === 'string' && htmlContent.trim() !== '') {
            $("#total_taxes").html(htmlContent); // 渲染到 <tbody id="total_taxes">
        } else {
            console.warn("content_taxes is empty or not a string:", htmlContent);
            $("#total_taxes").empty().append('<tr><td colspan="5" class="text-center text-muted">No tax data available</td></tr>');
        }

        // 其他字段更新(保持原逻辑)
        $(".sub-total").html(data.sub_total_invoice);
        $("#sub_total").val(data.sub_total_invoice);
        $(".total-taxes").html(data.sub_total_taxes);
        $("#total_taxes").val(data.sub_total_taxes);
        $(".total-invoice").html(data.total_invoice);
        $("#total_invoice").val(data.total_invoice);
    },
    error: function(xhr, status, error) {
        console.error("AJAX Error:", status, error, xhr.responseText);
    }
});<h4>3. HTML 结构验证(确保目标容器存在)</h4>
<p>确认你的表格结构匹配选择器:</p>
<pre class="brush:php;toolbar:false;">
# Tax description Value% Total VAT

⚠️ 注意事项与最佳实践

  • 永远不要在 HTML 字符串中拼接用户输入:若 $html_taxes 来源于数据库或表单,务必先 htmlspecialchars() 处理,再嵌入 内容,防止 XSS。
  • 避免在 PHP 中直接 echo HTML 到响应体:确保 json_encode() 是唯一输出,禁用任何额外 echo、print 或空白符(包括文件末尾换行)。
  • Laravel 用户注意:若使用 response()->json(),默认已设置正确头且启用 JSON_UNESCAPED_UNICODE,但仍建议显式传参:
    return response()->json($response, 200, [], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
  • 调试黄金法则:在 AJAX success 中 console.log(data) 后,展开查看 content_taxes 的实际类型与值——是 string?null?还是 {}?这比猜测更高效。
  • ✅ 总结

    HTML 字符串在 AJAX 中“消失”,90% 源于后端 JSON 序列化不严谨:变量覆盖、编码标志缺失、隐式类型转换或响应头错误。通过分离变量命名、显式 JSON 标志、强制响应头、前端空值校验四步,即可彻底解决。记住:动态渲染 HTML 的本质是「字符串传递」,确保它在 JSON 的每个环节都保持完整、可解析、可信任。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11584

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6681

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2175

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4228

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4954

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3891

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5597

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4382

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12322

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习