上次开发笔记里《基于zepto和WeUI的H5页面开发笔记》提到下拉刷新性能,这是很根本很罕用的性能,为了下次本人更便捷的应用,便简略的封装了一下 GScroll.js

demo.html
<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">    <title>基于WeUI和zepto.js的列表下拉刷新样例</title>    <!-- 引入 WeUI CDN 链接 -->    <link rel="stylesheet" href="https://res.wx.qq.com/t/wx_fed/weui-source/res/2.5.6/weui.css" />    <!-- 引入 zepto CDN 链接 -->    <script src="https://cdnjs.gtimg.com/cdnjs/libs/zepto/1.1.4/zepto.js"></script>    <!-- 引入 自定义滚动刷新 -->    <script src="./GScroll.js"></script>    <style>        html,        body {            height: 100%;        }        .container {            position: absolute;            top: 0;            right: 0;            bottom: 0;            left: 0;            overflow: hidden;            color: var(--weui-FG-0);        }        .page {            position: absolute;            top: 0;            right: 0;            bottom: 0;            left: 0;            overflow-y: auto;            -webkit-overflow-scrolling: touch;            box-sizing: border-box;            z-index: 1;        }        .page__bd {            height: 100%;            overflow: hidden;        }        .part-content {            padding: 5px;        }        .g-scroll-container {            height: 60%;            border: 1px solid #e5e5e5;            overflow: auto;        }    </style></head><body data-weui-theme="light">    <div class="container" id="container">        <div class="page">            <div class="page__bd">                <!-- 第二个tab的panel内容 -->                <div style="height: 40%;">                    <div class="part-content">                        <h5>下拉刷新样例</h5>                        const gs = <b>GScroll</b>(option);<br />                        <b>option:</b><br />                        containerEle //滚动内容的容器元素<br />                        contentEle //滚动的内容元素<br />                        loadMoreEle //滚动的内容里的最初的加载更多的元素<br />                        <b>pullToRefresh</b> //加载下一页的数据的钩子函数<br />                        //加载完渲染完,回调<b>gs.refreshed(page,isEnd)</b>更新状态                        <br />                    </div>                </div>                <div class="g-scroll-container">                    <div class="weui-cells g-scroll-content">                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字1</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字2</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字3</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字4</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字5</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字6</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字7</p>                            </div>                        </div>                        <div role="option" class="weui-cell ">                            <div class="weui-cell__bd">                                <p>题目文字8</p>                            </div>                        </div>                        <div role="alert" class="weui-loadmore">                            <span aria-hidden="true" role="img" aria-label="加载中" class="weui-primary-loading">                                <i class="weui-primary-loading__dot"></i>                            </span>                            <span class="weui-loadmore__tips">正在加载</span>                        </div>                    </div>                </div>            </div>        </div>    </div>    <script type="text/javascript">        $(function () {            const pageInfo = {                total: 3,                pageSize: 8            }            // 下拉滚动刷新            const gs = GScroll({                containerEle: $('.g-scroll-container')[0], //滚动内容的容器元素                contentEle: $('.g-scroll-content')[0], //滚动的内容元素                loadMoreEle: $(".g-scroll-container .weui-loadmore")[0], //滚动的内容里的最初的加载更多的元素                pullToRefresh: function (toPage) {                    //加载下一页的数据渲染,并回调 gs.refreshed(page,isEnd)                    setTimeout(function () {                        let addHtmlStr = '';                        for (let index = 0; index < pageInfo.pageSize; index++) {                            addHtmlStr += ` <div role="option" class="weui-cell  weui-cell_example">                                <div class="weui-cell__bd">                                    <p>题目文字${(toPage-1)*pageInfo.pageSize+index+1}</p>                                </div>                            </div>`;                        }                        $(gs.loadMoreEle).before(addHtmlStr);                        gs.refreshed(toPage, toPage == pageInfo.total);                    }, 1500);                }            });        });    </script></body></html>

GScroll.js

const GScroll = function (opt) {    const basicOption = {        containerEle: $('.gscroll-container')[0],        contentEle: $('.gscroll-content')[0],        loadMoreEle: $(".gscroll-container .weui-loadmore")[0],        touchStatus: 0, // 0 init 1 move 以后状态,move为正在touchmove        page: 1, //页数        scrollToNext: false, //滚动满足刷新下一页的标记        isEnd: false, //是否曾经滑到底部了,用于判断是否解决滚动 (如果只有一页,需设置为true,无需滚动加载)        loading: false, //正在加载数据的标记        pullToRefresh: undefined //满足滑动刷新加载数据的回调函数    };    const _thisGS = Object.assign({}, basicOption, opt);    //加载数据刷新后回调    _thisGS.refreshed = function (page, isEnd) { //page 加载的页数 isEnd 是否曾经加载到底部了        _thisGS.loading = false;        if (isEnd) {            _thisGS.isEnd = true;            $(_thisGS.loadMoreEle).remove();        }    }    //监听手指初始触碰    $(_thisGS.contentEle).on("touchstart", function (e) {        if (_thisGS.isEnd) return;        _thisGS.touchStatus = 1;    });    //判断向上时,如果滚动条在顶部,那么逐步减少下拉刷新的高度    $(_thisGS.contentEle).on("touchmove", function (e) {        if (_thisGS.isEnd) return;        if (!_thisGS.scrollToNext) {            var aa = $(_thisGS.containerEle).height();            var bb = $(this).scrollTop();            var cc = $(this).height();            var dd = aa - bb - cc;            if (dd < 50) {                _thisGS.scrollToNext = true;            }        }    });    //下拉刷新高度达到肯定值之后刷新页面    $(_thisGS.contentEle).on("touchend", function (e) {        if (_thisGS.isEnd) return;        if (_thisGS.touchStatus == 1 && _thisGS.scrollToNext && !_thisGS.loading) {            // console.log(`申请第${_thisGS.page}列表数据`);            _thisGS.loading = true;            _thisGS.page++;            _thisGS.pullToRefresh && _thisGS.pullToRefresh(_thisGS.page);            _thisGS.scrollToNext = false;        }        _thisGS.touchStatus = 0;    });    return _thisGS;}