| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 | 'use strict';(function ($) {    'use strict';    // Reasonable defaults    var PIXEL_STEP = 10;    var LINE_HEIGHT = 40;    var PAGE_HEIGHT = 800;    function normalizeWheel(event) {        var sX = 0; // spinX        var sY = 0; // spinY        var pX = 0; // pixelX        var pY = 0; // pixelY        // Legacy        if ('detail' in event) {            sY = event.detail;        }        if ('wheelDelta' in event) {            sY = -event.wheelDelta / 120;        }        if ('wheelDeltaY' in event) {            sY = -event.wheelDeltaY / 120;        }        if ('wheelDeltaX' in event) {            sX = -event.wheelDeltaX / 120;        }        // side scrolling on FF with DOMMouseScroll        if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {            sX = sY;            sY = 0;        }        pX = sX * PIXEL_STEP;        pY = sY * PIXEL_STEP;        if ('deltaY' in event) {            pY = event.deltaY;        }        if ('deltaX' in event) {            pX = event.deltaX;        }        if ((pX || pY) && event.deltaMode) {            if (event.deltaMode === 1) {                // delta in LINE units                pX *= LINE_HEIGHT;                pY *= LINE_HEIGHT;            } else {                // delta in PAGE units                pX *= PAGE_HEIGHT;                pY *= PAGE_HEIGHT;            }        }        // Fall-back if spin cannot be determined        if (pX && !sX) {            sX = pX < 1 ? -1 : 1;        }        if (pY && !sY) {            sY = pY < 1 ? -1 : 1;        }        return {            spinX: sX,            spinY: sY,            pixelX: pX,            pixelY: pY        };    }    var cachedWidth = null;    var getScrollBarWidth = function getScrollBarWidth() {        if (cachedWidth === null) {            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),                outer = $('<div/>').addClass('fixed-table-scroll-outer'),                w1 = void 0,                w2 = void 0;            outer.append(inner);            $('body').append(outer);            w1 = inner[0].offsetWidth;            outer.css('overflow', 'scroll');            w2 = inner[0].offsetWidth;            if (w1 === w2) {                w2 = outer[0].clientWidth;            }            outer.remove();            cachedWidth = w1 - w2;        }        return cachedWidth;    };    //获取原本表格体的滑块宽度    var getTableBodyScrollBarWidth = function getTableBodyScrollBarWidth(tableBody) {        return tableBody[0].scrollHeight > tableBody[0].clientHeight ? 15 : 0;    };    $.extend($.fn.bootstrapTable.defaults, {        fixedColumns: false,        fixedNumber: 0,        fixedRightNumber: 0    });    var BootstrapTable = $.fn.bootstrapTable.Constructor,        _initBody = BootstrapTable.prototype.initBody,        _initContainer = BootstrapTable.prototype.initContainer,        _trigger = BootstrapTable.prototype.trigger,        _hideLoading = BootstrapTable.prototype.hideLoading,        _updateSelected = BootstrapTable.prototype.updateSelected;    BootstrapTable.prototype.fixedColumnsSupported = function () {        var that = this;        return that.options.fixedColumns && !that.options.detailView && !that.options.cardView;    };    BootstrapTable.prototype.initFixedContainer = function () {        if (!this.fixedColumnsSupported()) {            return;        }        if (this.options.fixedNumber) {            this.$tableContainer.find('.fixed-columns').size() == 0 && this.$tableContainer.append('<div class="fixed-columns"></div>');            this.$fixedColumns = this.$tableContainer.find('.fixed-columns');        }        if (this.options.fixedRightNumber) {            this.$tableContainer.find('.fixed-columns-right').size() == 0 && this.$tableContainer.append('<div class="fixed-columns-right"></div>');            this.$fixedColumnsRight = this.$tableContainer.find('.fixed-columns-right');        }    };    BootstrapTable.prototype.initContainer = function () {        _initContainer.apply(this, Array.prototype.slice.apply(arguments));        this.initFixedContainer();    };    BootstrapTable.prototype.initBody = function () {        _initBody.apply(this, Array.prototype.slice.apply(arguments));        if (!this.fixedColumnsSupported()) {            return;        }        if (this.options.showHeader && this.options.height) {            return;        }        this.initFixedColumnsBody();        this.initFixedColumnsEvents();    };    BootstrapTable.prototype.trigger = function () {        var that = this;        _trigger.apply(this, Array.prototype.slice.apply(arguments));        if (arguments[0] === 'pre-body') {            //如果上来就是cardView 设置表格高度为auto            if (this.options.cardView) {                this.$tableBody.css("height", "auto");            }        }        //监听cardView 显示/隐藏fixed部分        if (arguments[0] === 'toggle') {            if (arguments[1]) {                this.$tableBody.css("height", "auto");                this.$fixedColumns && this.$fixedColumns.hide();                this.$fixedColumnsRight && this.$fixedColumnsRight.hide();            } else {                this.$tableBody.css("height", "100%");                this.$fixedColumns && this.$fixedColumns.show();                this.$fixedColumnsRight && this.$fixedColumnsRight.show();                this.$fixedHeaderRight && this.$fixedHeaderRight.scrollLeft(this.$tableBody.find('table').width());                this.$fixedBodyRight && this.$fixedBodyRight.scrollLeft(this.$tableBody.find('table').width());            }        }        if (!that.fixedColumnsSupported()) {            return;        }        if (arguments[0] === 'post-header') {            this.initFixedColumnsHeader();        } else if (arguments[0] === 'scroll-body') {            if (this.needFixedColumns && this.options.fixedNumber) {                this.$fixedBody && this.$fixedBody.scrollTop(this.$tableBody.scrollTop());            }            if (this.needFixedColumns && this.options.fixedRightNumber) {                this.$fixedBodyRight && this.$fixedBodyRight.scrollTop(this.$tableBody.scrollTop());            }        } else if (arguments[0] === 'load-success') {            this.hideLoading();        }    };    BootstrapTable.prototype.updateSelected = function () {        var that = this;        _updateSelected.apply(this, Array.prototype.slice.apply(arguments));        if (!this.fixedColumnsSupported()) {            return;        }        this.$tableBody.find('tr').each(function (i, el) {            var $el = $(el);            var index = $el.data('index');            var classes = $el.attr('class');            var inputSelector = '[name="' + that.options.selectItemName + '"]';            var $input = $el.find(inputSelector);            if (typeof index === 'undefined') {                return;            }            var updateFixedBody = function updateFixedBody($fixedHeader, $fixedBody) {                var $tr = $fixedBody.find('tr[data-index="' + index + '"]');                $tr.attr('class', classes);                if ($input.length) {                    $tr.find(inputSelector).prop('checked', $input.prop('checked'));                }                if (that.$selectAll.length) {                    $fixedHeader.add($fixedBody).find('[name="btSelectAll"]').prop('checked', that.$selectAll.prop('checked'));                }            };            if (that.$fixedBody && that.options.fixedNumber) {                updateFixedBody(that.$fixedHeader, that.$fixedBody);            }            if (that.$fixedBodyRight && that.options.fixedRightNumber) {                updateFixedBody(that.$fixedHeaderRight, that.$fixedBodyRight);            }        });    };    BootstrapTable.prototype.hideLoading = function () {        _hideLoading.apply(this, Array.prototype.slice.apply(arguments));        if (this.needFixedColumns && this.options.fixedNumber) {            this.$fixedColumns.find('.fixed-table-loading').hide();        }        if (this.needFixedColumns && this.options.fixedRightNumber) {            this.$fixedColumnsRight.find('.fixed-table-loading').hide();        }    };    BootstrapTable.prototype.initFixedColumnsHeader = function () {        var that = this;        if (this.options.height) {            this.needFixedColumns = this.$tableHeader.outerWidth(true) < this.$tableHeader.find('table').outerWidth(true);        } else {            this.needFixedColumns = this.$tableBody.outerWidth(true) < this.$tableBody.find('table').outerWidth(true);        }        var initFixedHeader = function initFixedHeader($fixedColumns, isRight) {            $fixedColumns.find('.fixed-table-header').remove();            $fixedColumns.append(that.$tableHeader.clone(true));            $fixedColumns.find('.fixed-table-header').css('margin-right', "");            $fixedColumns.css({                width: that.getFixedColumnsWidth(isRight)            });            return $fixedColumns.find('.fixed-table-header');        };        if (this.needFixedColumns && this.options.fixedNumber) {            this.$fixedHeader = initFixedHeader(this.$fixedColumns);            this.$fixedHeader.css('margin-right', '');        } else if (this.$fixedColumns) {            this.$fixedColumns.html('').css('width', '');        }        if (this.needFixedColumns && this.options.fixedRightNumber) {            this.$fixedHeaderRight = initFixedHeader(this.$fixedColumnsRight, true);            this.$fixedHeaderRight.scrollLeft(this.$fixedHeaderRight.find('table').width());        } else if (this.$fixedColumnsRight) {            this.$fixedColumnsRight.html('').css('width', '');        }        this.initFixedColumnsBody();        this.initFixedColumnsEvents();    };    BootstrapTable.prototype.initFixedColumnsBody = function () {        var that = this;        var initFixedBody = function initFixedBody($fixedColumns, $fixedHeader) {            $fixedColumns.find('.fixed-table-body').remove();            $fixedColumns.append(that.$tableBody.clone(true));            var $fixedBody = $fixedColumns.find('.fixed-table-body');            var tableBody = that.$tableBody.get(0);            var scrollHeight = tableBody.scrollWidth > tableBody.clientWidth ? getScrollBarWidth() : 0;            var paginationHeight = $(".fixed-table-pagination").height();            if (typeof that.options.height !== 'undefined') paginationHeight = 0;            var height = that.$tableContainer.outerHeight(true) - scrollHeight - paginationHeight + 1;            $fixedColumns.css({                height: height            });            $fixedBody.css({                height: height - $fixedHeader.height()            });            return $fixedBody;        };        if (this.needFixedColumns && this.options.fixedNumber) {            this.$fixedBody = initFixedBody(this.$fixedColumns, this.$fixedHeader);        }        if (this.needFixedColumns && this.options.fixedRightNumber) {            this.$fixedBodyRight = initFixedBody(this.$fixedColumnsRight, this.$fixedHeaderRight);            this.$fixedBodyRight.scrollLeft(this.$fixedBodyRight.find('table').width());            this.$fixedBodyRight.css('overflow-y', 'hidden');        }    };    BootstrapTable.prototype.getFixedColumnsWidth = function (isRight) {        var visibleFields = this.getVisibleFields();        var width = 0;        var fixedNumber = this.options.fixedNumber;        var marginRight = 0;        if (isRight) {            visibleFields = visibleFields.reverse();            fixedNumber = this.options.fixedRightNumber;            //右侧固定列距离            this.$fixedColumnsRight.css('right', getTableBodyScrollBarWidth(this.$tableBody));        }        for (var i = 0; i < fixedNumber; i++) {            width += this.$header.find('th[data-field="' + visibleFields[i] + '"]').outerWidth();        }        return width + 1;    };    BootstrapTable.prototype.initFixedColumnsEvents = function () {        var that = this;        var toggleHover = function toggleHover(e, toggle) {            var tr = 'tr[data-index="' + $(e.currentTarget).data('index') + '"]';            var $trs = that.$tableBody.find(tr);            if (that.$fixedBody) {                $trs = $trs.add(that.$fixedBody.find(tr));            }            if (that.$fixedBodyRight) {                $trs = $trs.add(that.$fixedBodyRight.find(tr));            }            $trs.css('background-color', toggle ? $(e.currentTarget).css('background-color') : '');        };        this.$tableBody.find('tr').hover(function (e) {            toggleHover(e, true);        }, function (e) {            toggleHover(e, false);        });        var isFirefox = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;        var mousewheel = isFirefox ? 'DOMMouseScroll' : 'mousewheel';        var updateScroll = function updateScroll(e, fixedBody) {            var normalized = normalizeWheel(e);            var deltaY = Math.ceil(normalized.pixelY);            var top = that.$tableBody.scrollTop() + deltaY;            if (deltaY < 0 && top > 0 || deltaY > 0 && top < fixedBody.scrollHeight - fixedBody.clientHeight) {                e.preventDefault();            }            that.$tableBody.scrollTop(top);            if (that.$fixedBody) {                that.$fixedBody.scrollTop(top);            }            if (that.$fixedBodyRight) {                that.$fixedBodyRight.scrollTop(top);            }        };        if (this.needFixedColumns && this.options.fixedNumber) {            this.$fixedBody.find('tr').hover(function (e) {                toggleHover(e, true);            }, function (e) {                toggleHover(e, false);            });            this.$fixedBody[0].addEventListener(mousewheel, function (e) {                //给鼠标滑轮绑定事件                updateScroll(e, that.$fixedBody[0]);            });            //给固定表格的checkbox绑定事件            this.$fixedBody.find('input[name="' + this.options.selectItemName + '"]').off("click").on('click', function (e) {                e.stopImmediatePropagation();                var index = $(e.target).data("index");                $(that.$selectItem[index]).trigger("click");            });            //绑定TD点击事件            this.$fixedBody.find('> table > tbody > tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {                var index = $(this).closest("tr[data-index]").data("index");                $(that.$selectItem[index]).closest("tr[data-index]").find(">td:eq(" + $(this).index() + ")").trigger("click");            });        }        //给原本表格绑定scroll事件        $('div.fixed-table-body').off('scroll'); //给所有的body解绑 scroll        this.$tableBody.off('scroll').on('scroll', function (e) {            that.$tableHeader.scrollLeft(0);            if (that.$tableBody.scrollLeft() > 0) {                that.$tableHeader.scrollLeft(that.$tableBody.scrollLeft());                if (that.options.showFooter && !that.options.cardView) {                    that.$tableFooter.scrollLeft(that.$tableBody.scrollLeft());                }            }            var top = that.$tableBody.scrollTop();            if (that.$fixedBody) {                that.$fixedBody.scrollTop(top);            }            if (that.$fixedBodyRight) {                that.$fixedBodyRight.scrollTop(top);            }        });        if (this.needFixedColumns && this.options.fixedRightNumber) {            this.$fixedBodyRight.find('tr').hover(function (e) {                toggleHover(e, true);            }, function (e) {                toggleHover(e, false);            });            this.$fixedBodyRight[0].addEventListener(mousewheel, function (e) {                //给鼠标滑轮绑定事件                updateScroll(e, that.$fixedBodyRight[0]);            });            //给固定表格的checkbox绑定事件            this.$fixedBodyRight.find('input[name="' + this.options.selectItemName + '"]').off("click").on('click', function (e) {                e.stopImmediatePropagation();                var index = $(e.target).data("index");                $(that.$selectItem[index]).trigger("click");            });            //绑定TD点击事件            this.$fixedBodyRight.find('> table > tbody > tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {                var index = $(this).closest("tr[data-index]").data("index");                $(that.$selectItem[index]).closest("tr[data-index]").find(">td:eq(" + $(this).index() + ")").trigger("click");            });        }        if (this.options.filterControl) {            $(this.$fixedColumns).off('keyup change').on('keyup change', function (e) {                var $target = $(e.target);                var value = $target.val();                var field = $target.parents('th').data('field');                var $coreTh = that.$header.find('th[data-field="' + field + '"]');                if ($target.is('input')) {                    $coreTh.find('input').val(value);                } else if ($target.is('select')) {                    var $select = $coreTh.find('select');                    $select.find('option[selected]').removeAttr('selected');                    $select.find('option[value="' + value + '"]').attr('selected', true);                }                that.triggerSearch();            });        }    };})(jQuery);
 |