DataTables v1.9.0中mDataProp的val参数始终为undefined问题咨询
解决DataTables v1.9.0数组数据源下mDataProp的val参数undefined问题及自定义过滤实现
首先,咱们先搞清楚为什么val参数总是undefined——这是DataTables 1.9.0针对数组型数据源(也就是你用的aaData二维数组)的特性:当数据源是数组的数组时,mDataProp函数的第三个参数val仅在type为'set'的时候才会有值,在'filter'、'sort'、'display'这些场景下,val都会是undefined。这和对象型数据源的行为不一样,对象数据源里val会对应字段的当前值,官方文档确实没把这个细节说清楚,很容易踩坑。
然后回答你的第二个问题:DataTables v1.9.0完全支持数组的数组作为数据源,aaData本身就是专门为这种格式设计的参数,只是mDataProp的参数逻辑在数组/对象数据源下有差异而已。
接下来咱们修改代码,实现你要的“过滤时去除HTML标签”的需求:
tableOptions["aoColumnDefs"] = [ { "mDataProp": function (source, type) { // source是当前行的数组,source[1]就是目标列的原始HTML内容 const rawHtml = source[1]; // 定义一个工具函数:去除HTML标签 function stripHtml(html) { // 用正则快速去除所有HTML标签,比DOM解析更高效 return html.replace(/<[^>]+>/g, '').trim(); } switch(type) { case 'filter': // 过滤时返回纯文本,避免匹配HTML标签内的内容 return stripHtml(rawHtml); case 'sort': // 排序可以选择用纯文本或者原始HTML,这里用纯文本更合理 return stripHtml(rawHtml); case 'display': // 显示的时候保留原始HTML return rawHtml; case 'set': // 当设置值时,这里的val会有传入的新值(不过数组数据源下很少用到set操作) source[1] = arguments[2]; // arguments[2]就是val return source[1]; default: // 默认返回原始HTML return rawHtml; } }, "sDefaultContent": '', "aTargets": [1] } ];
代码说明:
- 不再依赖
val参数,而是直接从source(当前行的数组)中获取目标列的内容(source[1],因为aTargets是[1],对应第二列)。 - 用正则表达式
/<[^>]+>/g快速去除HTML标签,比DOM解析更轻量,避免创建额外的DOM元素(如果你的场景必须用DOM解析,也可以保留angular.element的方式,但要注意正确调用:比如temp.html(rawHtml),然后用temp.text()获取纯文本)。 - 针对不同的
type返回对应的值:filter:返回纯文本,确保过滤逻辑只匹配可见内容;sort:同样返回纯文本,让排序基于实际显示的文本;display:返回原始HTML,保证表格显示正常;set:处理值设置的场景(数组数据源下这个操作比较少见,但还是兼容上)。
另外,你之前遇到的“没有sDefaultContent就报错”的问题,是因为当DataTables无法正确获取列数据时,会用sDefaultContent作为 fallback,现在我们的代码能正确从source中取到数据,这个属性其实可以保留,也可以根据情况去掉(不过建议保留,防止极端情况下的报错)。
内容的提问来源于stack exchange,提问作者j4v1
相关产品推荐
相关产品推荐

