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

模态框动态列场景下DataTable的scrollX翻页后功能异常求助

解决方案

这个问题是DataTable在模态框场景下,翻页重绘时无法正确计算容器宽度导致的水平滚动失效,可通过以下步骤修复:

1. 修正DataTable初始化配置

  • 新增autoWidth: false关闭自动宽度计算,避免动态列宽计算出错
  • 新增drawCallback回调,每次表格重绘(翻页、搜索、排序都会触发)后主动调用columns.adjust()修正列宽和滚动容器尺寸
  • 把提前生成的columnRef传入配置的columns参数,你当前代码里定义了这个变量但没有使用,会导致列配置不统一

2. 优化旧表格销毁逻辑

不要直接调用$('#mapattr').empty()清空整个表格,会破坏DataTable需要的DOM结构,只需要清空thead和tbody的内容即可。

3. 可选:给表格外层容器加独立滚动样式

如果还是有滚动异常,给包裹table的div加自定义样式,仅控制表格区域滚动,不会影响顶部的按钮、搜索框和底部分页组件:

.table-scroll-wrap {
    overflow-x: auto;
    width: 100%;
}

修改后的完整代码

<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document" style="margin:auto !important;max-width:1080px !important;">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">Map Attributes</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body" id="modalbody_1">
                <!-- 新增自定义滚动容器类 -->
                <div class="table-scroll-wrap">
                    <table id="mapattr" class="display nowrap" style="width:100%" cellspacing="0">
                        <thead></thead>
                        <tbody></tbody>
                    </table>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

<script>
var dataGSet = [];
var dataGArray;
var columnRef = [];

$.get(url, function(data) {
    columnRef = [];
    dataGSet = []; // 每次请求先清空旧数据,避免重复累加
    $("#mapattr > thead").empty().append("<tr></tr>");
    $("#mapattr > tbody").empty();
    $.each(data.features, function(a, b) {
        var cRow = [];
        $.each(b.properties, function(key, value) {
            if (a == 0) {
                $("#mapattr > thead > tr").append("<td>" + key + "</td>");
                columnRef.push({
                    title: key
                })
            }
            cRow.push(value);
        });
        dataGSet.push(cRow);
    });
}).done(function() {
    dataGArray = JSON.parse(JSON.stringify(dataGSet));
    if (!$.fn.DataTable.isDataTable('#mapattr')) {
        $("#mapattr").DataTable({
            dom: 'Bfrtip',
            data: dataGArray,
            columns: columnRef, // 传入提前生成的列配置
            scrollX: true,
            autoWidth: false, // 关闭自动宽度计算
            drawCallback: function () {
                // 每次重绘后调整列宽
                this.api().columns.adjust();
            },
            buttons: [
                'copy', 'csv', 'excel', 'pdf'
            ]
        });
    } else {
        let table = $('#mapattr').DataTable();
        table.destroy();
        // 不要清空整个table,只清空内容
        $("#mapattr thead").empty();
        $("#mapattr tbody").empty();
        $("#mapattr").DataTable({
            dom: 'Bfrtip',
            data: dataGArray,
            columns: columnRef,
            scrollX: true,
            autoWidth: false,
            drawCallback: function () {
                this.api().columns.adjust();
            },
            buttons: [
                'copy', 'csv', 'excel', 'pdf'
            ]
        });
    }
});
</script>

如果还是有偶发的滚动失效,可以在模态框完全展示后再初始化DataTable,绑定模态框的shown.bs.modal事件,在回调里执行初始化逻辑即可,确保模态框宽度已经渲染完成后再计算表格尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:04