在微信浏览器中,使用返回上一个页面

history.back()

或者使用物理返回都会造成微信浏览器强制刷新,相当于了reload页面。当我们的页面存在ajax请求渲染的数据时,这样就会造成非常不好的体验,用户在list列表点击某个item查看详情,每次返回时页面都会重新loading刷新。


解决方案:

主要通过

sessionStorag

实现解决。

1、在list页面刷新获取到的数据存进sessionStorag

2、判断是否从详情页返回,详情页设置refresh为true

sessionStorage.setItem("refresh", true);

3、list页面判断sessionStorag中是否同时存在listData和refresh,若存在则使用listData数据渲染页面,若不存在则刷新页面

4、点击list页面某个item时需要保存当前页码及当前滚动条位置到sessionStorag


page主要用于返回的缓存数据后定位当前页码,top定位浏览器滚动条当前位置



页面大致代码如下,使用了JS模板引擎及dropload刷新插件

JS模板:

<script type="text/html" id="tdTemplate">
    <% if(list.length>0){ %>
        <% for (var i = 0, leni = list.length; i < leni; i++) { %>
            <a href="<?php echo $this->createUrl('user/MessageDetail',array('id'=>''))?><%=list[i].id %>" class="msg-item-wrap unread">
                <img src="../../../../../public/kouzi/wechat/img/msg-icon.png" class="msg-item-icon">
                <div class="msg-item">
                    <div><%=list[i].title %></div>
                    <div class="msg-item-cont"><%=list[i].text %></div>
                </div>
                <div class="msg-item-date"><%=list[i].create %></div>
                <% if(list[i].read == 1){ %>
                    <div class="msg-item-tips"></div>
                <% } %>
            </a>
        <% } %>
    <% } %>
</script>


JS代码:

<script>
    $(function () {
        var pageSize = 10;
        var page = 0;
        var aList = '';
        var aParam = {};
        var autoLoad = true; //用于判断是否自动加载
        var refresh = sessionStorage.getItem('refresh'); //判断是否刷新(变量来自于详情页)
        var listData = '';
        backList();
        /**
         * 记录滚动条位置及页码
         **/
        $(document).on('click','.msg-item-wrap',function (e) {
            e.preventDefault();
            aParam = {
                page: page,  //当前页码
                top: $('.page-content').scrollTop()
            };
            aParam = JSON.stringify(aParam);
            sessionStorage.setItem('aParam', aParam);
            window.location.href = $(this).attr('href');
        });
        /**
         * 上拉刷新加载
         **/
        $('.page-content').dropload({
            scrollArea : $('.page-content'),
            autoLoad:autoLoad,
            domDown : {
                domClass   : 'dropload-down',
                domRefresh : '<div class="dropload-refresh">↑上拉加载更多</div>',
                domLoad    : '<div class="dropload-load"><span class="loading"></span>加载中...</div>',
                domNoData  : '<div class="dropload-noData">暂无更多消息</div>'
            },
            loadDownFn : function(me){
                $.ajax({
                    type: 'post',
                    url: '<?php echo $this->createUrl('user/ajaxMessageList')?>',
                    data:{
                        'page': page,
                        'pageSize': pageSize
                    },
                    success: function(result){
                        page = page+pageSize;
                        var items='';
                        if(result.data.list.length > 0){
                            items = template.render("tdTemplate", {list: result.data.list});
                            aList +=refresh ? listData+items : items;
                            sessionStorage.setItem('aList', aList);
                            sessionStorage.setItem('nomore', false);
                        }
                        if(result.data.list.length < pageSize || !result.data.list){
                            sessionStorage.setItem('nomore', true);
                            me.lock();
                            // 无数据
                            me.noData();
                        }
                        // 为了测试,延迟1秒加载
                        setTimeout(function(){
                            $('.msg-center-wrap').append(items);
                            // 每次数据加载完,必须重置
                            me.resetload();
                        },1000);
                    },
                    error: function(xhr, type){
                        // 即使加载出错,也得重置
                        me.resetload();
                    }
                });
            }
        });
        /**
         * 返回列表页时,取存储的sessionStorage数据,有,则取数据渲染页面,并滑到预期位置
         * 删除sessionStorage存储的历史数据
         */
        function backList() {
            listData = sessionStorage.getItem('aList');
            var param = JSON.parse(sessionStorage.getItem('aParam'));
            var nomore = JSON.parse(sessionStorage.getItem('nomore'));
            // listData用于保存列表数据
            // 页面加载时判断sessionStorage是否存有列表数据,有则赋值给listData,否则,listData取同步加载的第一页数据
//            window.listData = aList ? aList : pageConfig.listData;
            autoLoad = listData&&refresh ? false : true;
            if (listData != null && refresh) {
                // 加载列表
                $('.msg-center-wrap').html(listData);
                // 滚动到对应位置,并清除sessionStorage
                $('.page-content').scrollTop(param.top);
                page = param.page;
                //没有更多数据的时候延时加载样式
                if(nomore){
                    setTimeout(function () {
                        $('.dropload-refresh').addClass('dropload-noData').removeClass('dropload-refresh').text('暂无更多消息');
                    },100);
                }
                if(!refresh){
                    sessionStorage.removeItem('aList');
                    sessionStorage.removeItem('aParam');
                }
                sessionStorage.removeItem('refresh');
            }
        }
    })
</script>