js上万条数据瞬间渲染到页面,通过table表格演示

主页面文件html

var data = [];
        //创建一万条示例数据
        for (var i = 0; i < 10000; i++) {
            var row = { id: i, text: "text" + i };
            data.push(row);
        }

        //创建滚动条
        var scrbar = new Scrollbar();
        window.onload = function () {
            scrbar.CreateAt("divScroll");
            scrbar.setOptions({ total: 10000, size: 300 });
            scrbar.onScroll = function (pos) {
                ShowData(pos);
            }

            //获取模板
            var items = scrbar.getPageItems();
            var tpl = document.getElementById("trTpl");
            tpl.parentNode.removeChild(tpl);

            //仅创建所看到的几十行表格,所以自然快得多
            var list = document.getElementById("tblList");
            for (var i = 0; i < data.length && i < items; i++) {
                var nr = tpl.cloneNode(true);   //从模板行复制新行
                list.appendChild(nr);
            }
            ShowData(scrbar.getPos());
        }

        //根据滚动条,展示数据
        function ShowData(pos) {
            var n = scrbar.getPageItems();
            var rows = document.getElementById("tblList").rows;
            for (var i = 0; i < n; i++) {
                var row = rows[i];
                var item = data[i + pos];
                row.cells["tdID"].innerHTML = item["id"];
                row.cells["tdText"].innerHTML = item["text"];
            }
        }

 

Scrollbar.js文件

function Scrollbar() {
    this.options = {
        total: 0,   //数据总数
        pos: 0,     //当前滚动位置
        itemSize: 20,  //单项尺寸
        size: 500  //控件尺寸
    };
}
Scrollbar.prototype = (function () {
    function setOptions(options) {
        for (var attr in options) {
            this.options[attr] = options[attr];
        }
        Refresh(this);
    }
    function Refresh(_this) {
        if (!_this.created) return;

        //设置控件高度
        _this.bar.style.height = _this.options.size + "px";

        //设置内容高度
        var ch = _this.options.total * _this.options.itemSize;
        _this.content.style.height = ch + "px";
    }
    //获取滚动位置
    function getPos() {
        var top = this.bar.scrollTop;
        var pos = parseInt(top / this.options.itemSize);
        return pos;
    }
    //每页可展示的数据数量
    function getPageItems() {
        return this.options.size / this.options.itemSize;
    }

    //滚动事件响应
    function OnScroll(_this) {
        var pos = _this.getPos();
        if (pos == _this.options.pos) return;
        _this.options.pos = pos;
        _this.onScroll(pos);
    }

    //滚动条创建
    function CreateAt(dom) {
        var _this = this;

        var bar = document.createElement("div");
        var content = document.createElement("div");
        bar.appendChild(content);

        bar.style.width = "19px";
        bar.style.overflowY = "scroll";
        bar.style.overflowX = "hidden";
        if (bar.attachEvent) {
            bar.attachEvent("onscroll", function () { OnScroll(_this); });
        }
        else {//firefox兼容
            bar.addEventListener("scroll", function () { OnScroll(_this); }, false);
        }
        content.style.backgroundColor = "white";
        content.style.width = "1px";

        this.bar = bar;
        this.content = content;

        if (typeof (dom) == "string") {
            dom = document.getElementById(dom);
        }
        dom.innerHTML = "";
        dom.appendChild(this.bar);
        this.created = true;
        Refresh(this);
    }

    return {
        setOptions: setOptions,
        CreateAt: CreateAt,
        getPos: getPos,
        getPageItems: getPageItems,
        onScroll: null  //模拟滚动条事件
    };
})();

 

posted @ 2020-06-30 10:58  问问大将军  阅读(2601)  评论(0编辑  收藏  举报