本教程旨在解决datatables在加载包含html标签的数据时,意外渲染这些标签的问题。我们将探讨如何利用datatables的`columns.render`回调函数,结合jquery的`$.parsehtml`和dom元素的`innertext`属性,安全地提取纯文本内容并显示,从而防止恶意脚本执行和布局混乱。同时,也会介绍一种快速去除html标签的正则表达式方法,并强调数据源安全净化的重要性。
当DataTables加载包含HTML标签(如
, , ,甚至
本教程将提供两种主要方法来解决这些问题,并给出相应的代码示例和注意事项。
最推荐的方法是利用DataTables的columns.render选项,结合jQuery的$.parseHTML函数来安全地解析包含HTML的字符串,并提取其纯文本内容。这种方法能够有效防止HTML标签被渲染,同时也能抵御大部分XSS攻击。
首先,确保你的HTML页面包含了DataTables和jQuery的必要库。
DataTables HTML 渲染控制
DataTables 纯文本显示示例
| 姓名 | 年龄 |
|---|
在上述示例中,render函数会处理name列的数据。即使name字段包含p、b、h4或script等标签,最终显示在表格中的都将是这些标签内的纯文本内容。
脚本的执行,因为innerText只会提取文本,而不会执行脚本。如果你的需求仅仅是简单地去除所有HTML标签,并且对安全性要求不是极高(因为正则表达式可能无法完全覆盖所有复杂的HTML或恶意注入场景),可以使用正则表达式进行快速替换。DataTables自身在处理HTML类型列的排序时也采用了类似的方法。
使用JavaScript的String.prototype.replace()方法结合正则表达式/ <.>/g来匹配并移除所有HTML标签。
在DataTables的初始化中,修改name列的render函数:
$(document).ready(function() {
var myData = [
{ "name": "杰克
", "age": 29 },
{ "name": "玛德琳夫人", "age": 39 },
{ "name": "永恒之焰
", "age": 45 },
{ "name": "普通姓名无HTML", "age": 45 },
{ "name": "包含内部HTML的姓名", "age": 45 },
{ "name": "潜在风险", "age": 55 }
];
$('#example').DataTable({
data: myData,
columns: [
{
data: "name",
render: function(data, type, row, meta) {
// 使用正则表达式去除所有HTML标签
return data.replace(/<.*?>/g, '');
}
},
{ data: "age" }
]
});
});在处理DataTables中包含HTML的数据时,选择合适的方法至关重要:
首选 $.parseHTML + innerText:
谨慎使用正则表达式:
源头净化是关键:
通过合理运用DataTables的columns.render功能,结合jQuery提供的强大工具或简单的正则表达式,开发者可以有效地控制DataTables中数据的渲染方式,提升用户体验,并增强应用程序的安全性。