1. 程式人生 > >JS元件系列——Bootstrap Table 凍結列功能IE瀏覽器相容性問題解決方案

JS元件系列——Bootstrap Table 凍結列功能IE瀏覽器相容性問題解決方案

前言:最近專案裡面需要用到表格的凍結列功能,所謂“凍結列”,就是某些情況下表格的列比較多,需要固定前面的幾列,後面的列滾動。遺憾的是,bootstrap table裡自帶的fixed column功能有一點bug,於是和同事討論該如何解決,於是就有了這篇文章。

一、起因回顧

第一列固定

貌似問題完美解決!可是,事與願違,很遺憾,上面說了,這是谷歌瀏覽器的效果,沒有問題。我們來看看IE裡面

IE11效果:

IE10效果:

很顯然,不管是IE核心版本多少,凍結的列裡面的內容都無法顯示。怎麼辦?這可為難死寶寶了!

二、解決方案

還好有萬能的開源,檢視該頁面原始碼發現可以找到凍結列這個js的原始碼。

點選進入可以看到這個js的所有原始碼,找到原始碼就好辦了,我們試著改改原始碼看是否能解決這個bug。

我們在bootstrap-table下面的extensions資料夾下面新增加一個資料夾fixed-column

下面就貼出我們改好的原始碼:

(function ($) {
    'use strict';

    $.extend($.fn.bootstrapTable.defaults, {
        fixedColumns: false,
        fixedNumber: 1
    });

    var BootstrapTable = $.fn.bootstrapTable.Constructor,
        _initHeader 
= BootstrapTable.prototype.initHeader, _initBody = BootstrapTable.prototype.initBody, _resetView = BootstrapTable.prototype.resetView; BootstrapTable.prototype.initFixedColumns = function () { this.$fixedBody = $([ '<div class="fixed-table-column" style="position: absolute; background-color: #fff; border-right:1px solid #ddd;">',
'<table>', '<thead></thead>', '<tbody></tbody>', '</table>', '</div>'].join('')); this.timeoutHeaderColumns_ = 0; this.timeoutBodyColumns_ = 0; this.$fixedBody.find('table').attr('class', this.$el.attr('class')); this.$fixedHeaderColumns = this.$fixedBody.find('thead'); this.$fixedBodyColumns = this.$fixedBody.find('tbody'); this.$tableBody.before(this.$fixedBody); }; BootstrapTable.prototype.initHeader = function () { _initHeader.apply(this, Array.prototype.slice.apply(arguments)); if (!this.options.fixedColumns) { return; } this.initFixedColumns(); var $tr = this.$header.find('tr:eq(0)').clone(), $ths = $tr.clone().find('th'); $tr.html(''); for (var i = 0; i < this.options.fixedNumber; i++) { $tr.append($ths.eq(i).clone()); } this.$fixedHeaderColumns.html('').append($tr); }; BootstrapTable.prototype.initBody = function () { _initBody.apply(this, Array.prototype.slice.apply(arguments)); if (!this.options.fixedColumns) { return; } var that = this; this.$fixedBodyColumns.html(''); this.$body.find('> tr[data-index]').each(function () { var $tr = $(this).clone(), $tds = $tr.clone().find('td'); $tr.html(''); for (var i = 0; i < that.options.fixedNumber; i++) { $tr.append($tds.eq(i).clone()); } that.$fixedBodyColumns.append($tr); }); }; BootstrapTable.prototype.resetView = function () { _resetView.apply(this, Array.prototype.slice.apply(arguments)); if (!this.options.fixedColumns) { return; } clearTimeout(this.timeoutHeaderColumns_); this.timeoutHeaderColumns_ = setTimeout($.proxy(this.fitHeaderColumns, this), this.$el.is(':hidden') ? 100 : 0); clearTimeout(this.timeoutBodyColumns_); this.timeoutBodyColumns_ = setTimeout($.proxy(this.fitBodyColumns, this), this.$el.is(':hidden') ? 100 : 0); }; BootstrapTable.prototype.fitHeaderColumns = function () { var that = this, visibleFields = this.getVisibleFields(), headerWidth = 0; this.$body.find('tr:first-child:not(.no-records-found) > *').each(function (i) { var $this = $(this), index = i; if (i >= that.options.fixedNumber) { return false; } if (that.options.detailView && !that.options.cardView) { index = i - 1; } that.$fixedBody.find('thead th[data-field="' + visibleFields[index] + '"]') .find('.fht-cell').width($this.innerWidth() - 1); headerWidth += $this.outerWidth(); }); this.$fixedBody.width(headerWidth - 1).show(); }; BootstrapTable.prototype.fitBodyColumns = function () { var that = this, top = -(parseInt(this.$el.css('margin-top')) - 2), height = this.$tableBody.height() - 2; if (!this.$body.find('> tr[data-index]').length) { this.$fixedBody.hide(); return; } this.$body.find('> tr').each(function (i) { that.$fixedBody.find('tbody tr:eq(' + i + ')').height($(this).height() - 1); }); //// events this.$tableBody.on('scroll', function () { that.$fixedBody.find('table').css('top', -$(this).scrollTop()); }); this.$body.find('> tr[data-index]').off('hover').hover(function () { var index = $(this).data('index'); that.$fixedBody.find('tr[data-index="' + index + '"]').addClass('hover'); }, function () { var index = $(this).data('index'); that.$fixedBody.find('tr[data-index="' + index + '"]').removeClass('hover'); }); this.$fixedBody.find('tr[data-index]').off('hover').hover(function () { var index = $(this).data('index'); that.$body.find('tr[data-index="' + index + '"]').addClass('hover'); }, function () { var index = $(this).data('index'); that.$body.find('> tr[data-index="' + index + '"]').removeClass('hover'); }); }; })(jQuery);
bootstrap-table-fixed-columns.js修改後的原始碼
        .fixed-table-container thead th .th-inner, .fixed-table-container tbody td .th-inner {
            line-height: 18px;
        }

        .fixed-table-pagination .pagination a {
            padding: 5px 10px;
        }

        .fixed-table-toolbar .bars, .fixed-table-toolbar .search, .fixed-table-toolbar .columns {
            margin-top: 5px;
            margin-bottom: 5px;
        }
bootstrap-table-fixed-columns.css修改後

主要修改的地方:

1)原始碼裡面將thead和tbody分別封裝成了一個單獨的表格,修改後將thead和tbody放到了一個table裡面;

2)依次遍歷凍結的列放入到固定的tbody裡面;

其實也就改了那麼幾個地方,就能完美解決IE的bug。我們先來看看效果:

IE11

IE10

IE8

我們再來看看如何使用。

1、引用js和對應的css

<script src="~/Content/bootstrap-table/extensions/fixed-column/js/bootstrap-table-fixed-columns.js"></script>
<link href="~/Content/bootstrap-table/extensions/fixed-column/css/bootstrap-table-fixed-columns.css" rel="stylesheet" />

2、js呼叫如下

加兩個引數fixedColumns和fixedNumber即可,什麼意思不用過多解釋,是否凍結列、凍結列的列數。還有一點需要說明的是,這裡呼叫的時候不能指定它的height,如果指定height,表格的凍結顯示會有問題。

三、總結

以上就是表格凍結關於IE相容性問題的解決方案,如果你也正好用到bootstrap table 的列凍結,呵呵,福利來了。總體上來說,就是在原有擴充套件js的基礎上面做了一些小小的修改。能用,如果大夥覺得有什麼問題,歡迎指出。

相關推薦

JS元件系列——Bootstrap Table 凍結功能IE瀏覽器相容性問題解決方案

前言:最近專案裡面需要用到表格的凍結列功能,所謂“凍結列”,就是某些情況下表格的列比較多,需要固定前面的幾列,後面的列滾動。遺憾的是,bootstrap table裡自帶的fixed column功能有一點bug,於是和同事討論該如何解決,於是就有了這篇文章。 一、起因回顧 第一列固定 貌似

JS元件系列——Bootstrap Table 表格行拖拽

前言:之前一直在研究DDD相關知識,好久沒更新JS系列文章了。這兩天做了一個簡單的業務需求,覺得效果還可以,今天在這裡分享給大家,歡迎拍磚~~ 一、業務需求及實現效果 專案涉及到訂單模組,那天突然接到一個需求,說是兩種不同狀態的訂單之間要實現插單的效果,頁面上呈現方式是:左右兩個Table,左邊Table

JS元件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

前言:前天剛寫了篇JS元件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基礎上能夠同時拖拽選中的多行。博主用了半天時間研究了下,效果是出來了,但是感覺不盡如人意。先把它分享出來,以後想到更好的辦法再優化吧。 一、效果展示 1、拖動前 2、拖動中

bootstrap table 凍結 操作無效

在bootstrap-table-fixed-columns.js 中修改程式碼   本人程式碼操作列是 使用a標籤  見下圖 當然 找a標籤的時候可以直接使用fixtb.find('a');無需再去判斷 具體判斷新增點選事件位置 需要根據自己專案情況酌情修改    

JS元件系列——Bootstrap右鍵選單解決方案:ContextMenu

前言:有段時間沒發表隨筆了,過個年人都變得懶了。新年剛來上班,今天正好得空,將去年遺留的兩個小元件總結記錄下。有朋友跟我說:你的bootstrap元件要能夠形成一個可以滿足一般專案需求的系列元件,才有真正的實用價值。想想說得在理。這不今天來總結下bootstrap的一個小元件的應用。好了,不說廢話,進入正題吧

JS元件系列——Bootstrap 樹控制元件使用經驗分享

前言:很多時候我們在專案中需要用到樹,有些樹僅僅是展示層級關係,有些樹是為了展示和編輯層級關係,還有些樹是為了選中項然後其他地方呼叫選中項。不管怎麼樣,樹控制元件都是很多專案裡面不可或缺的元件之一。今天,博主打算結合自己的使用經歷和網上找到的一些不錯的樹控制元件在這裡做一個分享,希望能幫大家找到最合適的控制元

JS元件系列——Bootstrap元件福利篇:幾款好用的元件推薦

前言:之前分享過很多bootstrap常用元件,包括表格、表單驗證、檔案上傳、複選下拉框、彈出框等。這段時間,博主又收藏了一些好用的元件(有些在專案中已經用起來了),經過兩天的時間,已經整理出了一部分,本著“好東西要與人分享”的原則,今天還是來點福利,將博主收藏的東西分享出來,供需要的園友參考。元件大部分都是

JS元件系列——Bootstrap寒冬暖身篇:彈出框和提示框效果以及程式碼展示

前言:對於Web開發人員,彈出框和提示框的使用肯定不會陌生,比如常見的表格新增和編輯功能,一般常見的主要有兩種處理方式:行內編輯和彈出框編輯。在增加使用者體驗方面,彈出框和提示框起著重要的作用,如果你的系統有一個友好的彈出提示框,自然能給使用者很好的頁面體驗。前面幾章介紹了bootstrap的幾個常用元件,這

JS元件系列——Bootstrap元件福利篇:幾款好用的元件推薦(二)

前言:上篇 JS元件系列——Bootstrap元件福利篇:幾款好用的元件推薦 分享了幾個專案中比較常用的元件,引起了許多園友的關注。這篇還是繼續,因為博主覺得還有幾個非常簡單、實用的元件,實在不願自己一人獨享,沒辦法,誰讓博主這麼愛分享呢~~ 七、多值輸入元件manifest 關於文字框的多值輸入,一

JS元件系列——Bootstrap Select2元件使用小結

前言:在介紹select元件的時候,博主之前分享過一篇JS元件系列——兩種bootstrap multiselect元件大比拼,這兩個元件的功能確實很強大,只可惜沒有圖文結合的效果(也就是將圖片放入到select裡面隨著文字一起顯示)。前兩天做一個選單圖示選擇的功能,就要用到這個圖文選擇的功能。於是乎又是找啊

JS元件系列——Bootstrap檔案上傳元件bootstrap fileinput

前言:之前的三篇介紹了下bootstrap table的一些常見用法,發現博主對這種扁平化的風格有點著迷了。前兩天做一個excel匯入的功能,前端使用原始的input type='file'這種標籤,效果不忍直視,於是博主下定決心要找一個好看的上傳元件換掉它。既然bootstrap開源,那麼社群肯定有很多關於

bootstrap-table表格寬設定無效問題解決

關於調整boorstrap-table的列寬,自己在網上找了一下資料。現在分享給大家。{title: '備註, field: 'notes', visible: true, align: 'center

JS元件系列——自己動手擴充套件BootstrapTable的 凍結 功能:徹底解決高度問題

前言:一年前,博主分享過一篇關於bootstrapTable元件凍結列的解決方案  JS元件系列——Bootstrap Table 凍結列功能IE瀏覽器相容性問題解決方案 ,通過該篇,確實可以實現bootstrapTable的凍結列效果,並且可以相容ie瀏覽器。這一年的時間,不斷有園友以及群裡面的朋友問過我關

JS元件系列——表格元件神器:bootstrap table(三:終結篇,最後的乾貨福利)

前言:前面介紹了兩篇關於bootstrap table的基礎用法,這章我們繼續來看看它比較常用的一些功能,來個終結篇吧,毛爺爺告訴我們做事要有始有終~~bootstrap table這東西要想所有功能覆蓋似乎不太現實,博主挑選了一些自認為比較常用的功能在此分享給各位園友。原始

JS元件系列——表格元件神器:bootstrap table

前言:之前一直在忙著各種什麼效果,殊不知最基礎的Bootstrap Table用法都沒有涉及,罪過,罪過。今天補起來吧。上午博主由零開始自己從頭到尾使用了一遍Bootstrap Table ,遇到不少使用方面的問題,也做了一部分筆記,在此分享出來供需要使用的園友參考。還記得前

JS元件系列——表格元件神器:bootstrap table(二:父子表和行列調序)

前言:上篇 JS元件系列——表格元件神器:bootstrap table 簡單介紹了下Bootstrap Table的基礎用法,沒想到討論還挺熱烈的。有園友在評論中提到了父子表的用法,今天就結合Bootstrap table的父子表和行列調序的用法再來介紹下它稍微高階點的用法

JS元件系列——兩種bootstrap multiselect元件大比拼[轉載]

轉載原文地址:https://www.cnblogs.com/landeanfen/p/5013452.html 前言:今天繼續來看看bootstrap的另一個元件:multiselect。記得在專案開始之前,博主專案組幾個同事就使用哪些js元件展開過討論,其中就說到了select元件,

JS元件系列——自己動手擴充套件BootstrapTable的treegrid功能

前言:上篇  JS元件系列——自己動手封裝bootstrap-treegrid元件 博主自己動手封裝了下treegrid的功能,但畢竟那個元件只是一個單獨針對樹形表格做的,適用性還比較有限。關注博主的園友應該知道,博主的部落格裡面寫了很多bootstrapTable的擴充套件,今天打算在直接在bootstra

JS元件系列——不容錯過的兩款Bootstrap Icon圖示選擇元件

前言:最近好多朋友在群裡面聊到bootstrap icon圖示的問題,比如最常見的選單管理,每個選單肯定需要一個對應的選單圖示,要是有一個視覺化的圖示選擇元件就好了,最好是直接選擇圖示,就能得到對應的class樣式。於是乎各種百度,皇天不負有心人,最後被博主找到了,感覺效果還不錯,並且支援自定義的圖示,今天就

JS元件系列——再推薦一款好用的bootstrap-select元件,親測還不錯

前言:之前分享過兩篇bootstrap下拉框的元件:JS元件系列——兩種bootstrap multiselect元件大比拼  和 JS元件系列——Bootstrap Select2元件使用小結 ,收到很多園友的關注和提問,最後總結這兩篇裡面的下拉框元件都存在一些大大小小的問題,比如兩種bootstrap m