移动端项目有一个功能是要展示很多列表,需要分页展示,虽然之前用过better-scroll插件,但是这次我想自己写,看似简单,实则很多细节需要处理。
首先在获取滚动轴高度、文档高度、屏幕可视区域高度时出现兼容问题:
//滚动轴高度
var scrollTop = $(document).scrollTop() || window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
//文档高度
var scrollMinuend = document.documentElement.scrollHeight || $(document).height();
//可视区域高度
var scrollSubtract = window.innerHeight || $(window).height();
主要逻辑是:达到一个临界条件就再次获取数据,这个条件是
scrollTop + scrollSubtract >= scrollMinuend
出现的一些问题:
//初始设为false,允许发请求
var ajaxFlag = false;
function scrolls() {
//如果为true说明已经有请求在发送了,不允许再次发送
if (ajaxFlag) {
return;
}
var scrollTop = $(document).scrollTop() || window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
var scrollMinuend = document.documentElement.scrollHeight || $(document).height();
var scrollSubtract = window.innerHeight || $(window).height();
if (scrollTop + scrollSubtract >= scrollMinuend) {
$('.load').css({
'display': 'block',
'position': 'fixed'
});
//发送请求前将锁锁上
ajaxFlag = true;
pageNum += 1;
ajaxFun(pageNum, conNum, sDate, eDate, productClassify, productName, conNr, state, listJion);
}
}
该请求处理完后将ajaxFlag 设为false。
2) 我这个项目里还有一个查询功能,所以除了正常的滑动查询外,还要兼顾查询来“捣乱”,每次查询都要将变量“洗牌”,例如将pageIndex重置为1,将页面清空再添加新元素,每次请求时要带着筛选条件进行请求。。。
3) 当无数据时要禁止onscroll事件
(代码放在最后)
每项点进去详情页再返回时要定位在原位置,如果没有分页那就太简单了,只需要滚动轴的高度值,现在有分页,就要多考虑了。
刚开始我想着把滚动轴的高度值tops和页面数page放入sessionStorage中,返回页面时多次请求数据。
后来我想数据量不大直接把请求到的数据以及筛选条件都放入sessionStorage中,
function bindClick(ele) {
planNum = $(ele).attr('data-plannum');
lineId = $(ele).attr('data-lineid');
tops = window.scrollY;
sessionStorage.setItem('tops', tops);
sessionStorage.setItem('pageNum', pageNum);
sessionStorage.setItem('sDate', sDate);
sessionStorage.setItem('eDate', eDate);
sessionStorage.setItem('productClassify', productClassify);
sessionStorage.setItem('productName', productName);
sessionStorage.setItem('conNr', conNr);
sessionStorage.setItem('state', state);
sessionStorage.setItem('pageData', JSON.stringify(pageData));
location.href = 'productWoodInfo.html?PlanNum=' + planNum + '&LineId=' + lineId;
}
页面初始化的时候再取回来,
function topData() {
tops = sessionStorage.getItem('tops') ? parseInt(sessionStorage.getItem('tops')) : parseInt(0);
pageNum = sessionStorage.getItem('pageNum') ? parseInt(sessionStorage.getItem('pageNum')) : parseInt(0);
sDate = sessionStorage.getItem('sDate') ? sessionStorage.getItem('sDate') : '';
eDate = sessionStorage.getItem('eDate') ? sessionStorage.getItem('eDate') : '';
productClassify = sessionStorage.getItem('productClassify') ? sessionStorage.getItem('productClassify') : 'all';
productName = sessionStorage.getItem('productName') ? sessionStorage.getItem('productName') : '';
conNr = sessionStorage.getItem('conNr') ? sessionStorage.getItem('conNr') : '';
state = sessionStorage.getItem('state') ? sessionStorage.getItem('tops') : '0';
pageData = sessionStorage.getItem('pageData') ? JSON.parse(sessionStorage.getItem('pageData')) : [];
}
注意,当初始化渲染完页面后,要把sessionStorage清除掉,否则你会发现不管是从别的页面进入还是刷新都是原来的数据
sessionStorage.clear(); //如果取不存在的键返回null
下面是瀑布流的主要代码
DOM
//加载动画
javascript
function ajaxFun(pageNum, conNum, sDate, eDate, productClassify, productName, conNr, state, callBack) {
$.ajax({
url: 'xxxxxxx',
type: 'post',
data: {
action: 'GetListWood',
UserID: localStorage.UserCode,
Pageindex: pageNum,
pagesize: conNum,
Sdate: sDate,
Edate: eDate,
OType: productClassify,
ItemName: productName,
Connr: conNr,
DocStatus: state
},
success: function (data) {
if (data !== '') {
var jsData = JSON.parse(data);
if (jsData.length == 0) {
$(window).off('scroll');
//没有符合查询条件的数据,则把页面清空
if (pageNum == 1) {
oBox.children().remove();
}
infoJion();
} else {
//如果已经翻到页面最后停掉滚动事件,则再查询的时候数据大于一页要开启滚动
if (lock && jsData.length >= conNum) {
$(window).on('scroll', scrolls);
}
if (pageNum == 1) {
$(document).scrollTop(0);
}
callBack(jsData);
}
lock = false;
$('.load').css('display', 'none');
pageData = pageData.concat(jsData);
ajaxFlag = false;
} else {
alert('数据查询有误!')
}
},
error: function (xhr, errorText, errorType) {
$('.load').css('display', 'none');
alert(errorText + ' ' + errorType);
}
})
}
//没有数据的时候拼接提示信息
function infoJion() {
var html = '';
html += '~~底线~~
';
oBox.append(html);
}