2017 年 12 月 31 日星期日

垂直捲軸調整

早在 2015 年,我為 DataTables 介紹了一個外掛程式,該程式能夠動態更改表格的頁面長度,使其適合容器內。當啟用分頁且停用捲軸時,這項功能運作良好,但 DataTable 的垂直調整也自然適用於捲軸。

在這篇文章中,我將介紹一個在啟用捲軸時適用於 DataTables 的等效外掛程式 - 最終結果如下所示

姓名職位辦公室薪資
Tiger Nixon系統架構師愛丁堡$320,800
Garrett Winters會計東京$170,750
Ashton Cox初級技術作家舊金山$86,000
Cedric Kelly資深 Javascript 開發人員愛丁堡$433,060
Airi Satou會計東京$162,700
Brielle Williamson整合專家紐約$372,000
Herrod Chandler銷售助理舊金山$137,500
Rhona Davidson整合專家東京$327,900
Colleen HurstJavascript 開發人員舊金山$205,500
Sonya Frost軟體工程師愛丁堡$103,600
Jena Gaines辦公室經理倫敦$90,560
Quinn Flynn支援主管愛丁堡$342,000
Charde Marshall區域總監舊金山$470,600
Haley Kennedy資深行銷設計師倫敦$313,500
Tatyana Fitzpatrick區域總監倫敦$385,750
Michael Silva行銷設計師倫敦$198,500
Paul Byrd財務長 (CFO)紐約$725,000
Gloria Little系統管理員紐約$237,500
Bradley Greer軟體工程師倫敦$132,000
Dai Rios人事主管愛丁堡$217,500
Jenette Caldwell開發主管紐約$345,000
Yuri Berry行銷長 (CMO)紐約$675,000
Caesar Vance售前支援紐約$106,450
Doris Wilder銷售助理雪梨$85,600
Angelica Ramos執行長 (CEO)倫敦$1,200,000
Gavin Joyce開發人員愛丁堡$92,575
Jennifer Chang區域總監新加坡$357,650
Brenden Wagner軟體工程師舊金山$206,850
Fiona Green營運長 (COO)舊金山$850,000
Shou Itou區域行銷東京$163,000
Michelle House整合專家雪梨$95,400
Suki Burks開發人員倫敦$114,500
Prescott Bartlett技術作家倫敦$145,000
Gavin Cortez團隊領導舊金山$235,500
Martena Mccray售後支援愛丁堡$324,050
Unity Butler行銷設計師舊金山$85,675
Howard Hatfield辦公室經理舊金山$164,500
Hope Fuentes秘書舊金山$109,850
Vivian Harrell財務總監舊金山$452,500
Timothy Mooney辦公室經理倫敦$136,200
Jackson Bradshaw總監紐約$645,750
Olivia Liang支援工程師新加坡$234,500
Bruno Nash軟體工程師倫敦$163,500
Sakura Yamamoto支援工程師東京$139,575
Thor Walton開發人員紐約$98,540
Finn Camacho支援工程師舊金山$87,500
Serge Baldwin資料協調員新加坡$138,575
Zenaida Frank軟體工程師紐約$125,250
Zorita Serrano軟體工程師舊金山$115,000
Jennifer Acosta初級 Javascript 開發人員愛丁堡$75,650
Cara Stevens銷售助理紐約$145,600
Hermione Butler區域總監倫敦$356,250
Lael Greer系統管理員倫敦$103,500
Jonas Alexander開發人員舊金山$86,500
Shad Decker區域總監愛丁堡$183,000
Michael BruceJavascript 開發人員新加坡$183,000
Donna Snider客戶支援紐約$112,000
點擊並拖曳我!

使用方式

使用 DataTables 的 ScrollResize 外掛程式非常簡單 - 在您的頁面上包含外掛程式的 Javascript

JS

然後在您的 DataTable 初始化中指定 scrollResize 選項來啟用該功能,同時使用 scrollY 來啟用捲軸

$('#myTable').DataTable( {
    scrollResize: true,
    scrollY: 100,
    scrollCollapse: true,
    paging: false
} );

請注意,您通常在使用 ScrollResize 時也會停用分頁,如此處所做,但這不是強制性的(分頁對於改善較大資料集的效能很有用)。

版面配置

在 DataTable 初始化時,給予 scrollY 的值(在上面的範例中為 100px)實際上並不重要,因為表格的捲軸容器會自動調整大小以符合表格放置的容器。這是一個重點,因為定義表格高度的不是 DataTable 本身,而是放置它的 DOM 容器元素。

在上面的範例中,使用 div 元素作為表格的包裝,並使用 Javascript 來調整容器大小。沒有額外的 Javascript 告訴 DataTables 它需要調整大小 - 這是由 ScrollResize 外掛程式自動決定的,保持初始化簡單且腳本效能良好(請參閱下面的實作部分了解如何做到這一點)。

雖然您可能希望為您的最終用戶提供調整表格容器大小的能力,但這種方法的真正好處可以透過 DataTables 自動調整自身以適應您定義的版面配置來看出

實作

與原始的分頁調整大小外掛程式一樣,為了讓 ScrollResize 自動調整表格大小,它需要知道何時發生調整大小。我們可以在 DataTables API 中提供和觸發 Javascript 方法,但這對開發人員不友善,因為頁面上的每次更新或重繪都需要呼叫該方法。能夠自動確定何時需要發生這種情況會更好。

問題在於,瀏覽器只有在視窗大小變更時才會觸發調整大小事件 - 而不是在 DOM 元素移動時觸發(因為這樣做效率會非常低)。分頁調整大小外掛程式使用 object 來知道容器何時已調整大小,但這在 IE 中導致了樣式問題。ScrollResize 使用基本相同的概念,但使用 iframe,它沒有任何此類樣式問題

        var that = this;
        var obj = $('<iframe/>')
            .css( {
                position: 'absolute',
                top: 0,
                left: 0,
                height: '100%',
                width: '100%',
                zIndex: -1,
                border: 0
            } )
            .attr( 'frameBorder', '0' )
            .attr( 'src', 'about:blank' );

        obj[0].onload = function () {
            var body = this.contentDocument.body;
            var height = body.offsetHeight;
            var contentDoc = this.contentDocument;
            var defaultView = contentDoc.defaultView || contentDoc.parentWindow;

            defaultView.onresize = function () {
                // Three methods to get the iframe height, to keep all browsers happy
                var newHeight = body.clientHeight || body.offsetHeight;
                var docClientHeight = contentDoc.documentElement.clientHeight;

                if ( ! newHeight && docClientHeight ) {
                    newHeight = docClientHeight;
                }

                if ( newHeight !== height ) {
                    height = newHeight;

                    // Resize has happened - trigger callback
                }
            };
        };

        obj
            .appendTo( host )
            .attr( 'data', 'about:blank' );

有了知道何時發生調整大小的程式碼,我們需要做的就是更新 DataTables 的捲軸容器(減去標頭和頁腳的高度),使其完美地適合容器。

這種自動知道容器元素何時已調整大小的基本實作幾乎肯定會進入 DataTables 2.0(更多關於 2018 年的消息),因為它抽象化了許多問題,例如需要呼叫 columns.adjust() 當隱藏的表格變成可見時。

歡迎回饋

一如既往,非常歡迎改進和建議!此外掛程式的程式碼託管在 GitHub 上。如果您有任何改進的想法,請發送提取請求,或在論壇中開啟新的討論。

新年快樂!