js 滚动加载实现(根本不需要一大堆js库)

Tips:代码中easyui treegrid的操作(项目中用easyui),代码并不能放之四海而皆准,
但是可以通过代码了解滚动加载的原理(只为学习)。

/**
 * @author wsf 前台分页(只对已经加载的数据进行分割)
 */
;
(function (win,$){
	/**
	 * 自定义命名空间
	 */
	$.scrollPage = $.extend({},{
		/**
		 * page对象
		 */
		config:{
			pageData:{},//页面数据
			dataLoding:false,//是否正在加载数据
			canStartLoadData:false,//是否可以开始加载数据
			pageNo:1,//页码
			pageItem:10,//没有的数据条数(每页显示的条数)
			currentPageItem:30,//当前页面显示了多少数据
			time:null,//时间及时器
			speed:10,//判断是否可加载的间隔
		},
		/**
		 * 初始化
		 */
		init:function (_config){
			var _this = $.scrollPage;//
			$.extend(_this.config,_config);
			return _this;//为了链式操作
		},
		/**
		 * 设置pageData
		 */
		setPageData:function (pageData){
			this.config.pageData = pageData;
		},
		/**
		 * 加载下一页
		 */
		getNext:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			var sliceStart = cfg.currentPageItem;//数组截取开始下标
			cfg.pageNo ++;//页码加一
			cfg.currentPageItem = cfg.pageNo*cfg.pageItem;	
			var sliceEnd = cfg.currentPageItem;//数组截取开始下标
			return cfg.pageData.slice(sliceStart,sliceEnd);
		},
		/**
		 * 返回前一页
		 */
		getPrev:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			var sliceEnd = cfg.currentPageItem;//数组截取开始下标
			cfg.pageNo--;//页码加一
			cfg.currentPageItem = 	cfg.pageNo*cfg.pageItem;	
			var sliceStart = cfg.currentPageItem;//数组截取开始下标
			return cfg.pageData.slice(sliceStart,sliceEnd);
		},
		/**
		 * 监听页面滚动事件
		 */
		listener:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			//var _canStart = _this._canStartLoadData();//是否可以开始加载
			var _canStart = _this.isPageBottom();//是否滚动到页面底部
			if(_canStart){
				showMyLoading();
				_this._startLoad(_this._endLoad);//开始加载
			}
			return _this;
		},
		/**
		 * 开始加载数据
		 */
		_startLoad:function (callback){
			var _this = $.scrollPage;
			var cfg = _this.config;
			cfg.dataLoding = true;//正在加载数据
			var _loadData = _this.getNext();//要加载的数据
			for(var i in _loadData){
				_this._addRow(_loadData[i]);//添加行
			}
			if(callback)
				callback();
		},
		/**
		 * 添加行
		 */
		_addRow:function (_pageData){
			var _this = $.scrollPage;
			var cfg = _this.config;
			$('#content').treegrid('append',{
	              parent: 0,  // 这里指定父级标识就可以了
	              data: [_pageData]
	        });
			_this._interlaceRow();//隔行变色
		},
		/**
		 * 加载结束
		 */
		_endLoad:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			cfg.dataLoding = false;
			cfg.canStartLoadData = false;
			setTimeout(function (){
				closeLoading();
			},2000);
			return _this;
		},
		/**
		 * 是否可以开始加载数据
		 */
		_canStartLoadData:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			var scrollPos = _this._scrollPosition();
			
		},
		/**
		 * 页面滚动到哪个地方了
		 */
		_scrollPosition:function (){
			var _this = $.scrollPage;
			var cfg = _this.config;
			var scrTop = $("body").scrollTop();//页面的滚动高度
			return scrTop;
		},
		/**
		 * 判断页面是否滚动到底部
		 */
		isPageBottom:function () {  
		    var scrollTop = 0;  
		    var clientHeight = 0;  
		    var scrollHeight = 0;  
		    /*
		    if (document.documentElement && document.documentElement.scrollTop) {  
		        scrollTop = document.documentElement.scrollTop;  
		    } else if (document.body) {  
		        scrollTop = document.body.scrollTop;  
		    }  */
		    scrollTop = $(document).scrollTop();
		    /*
		    if (document.body.clientHeight && document.documentElement.clientHeight) {  
		        clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight: document.documentElement.clientHeight;  
		    } else {  
		        clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight: document.documentElement.clientHeight;  
		    }  */
		    clientHeight = $(document).height();
		    // 知识点:Math.max 比较大小,取最大值返回  
		    scrollHeight = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);  
		    if (scrollTop + clientHeight == scrollHeight) {  
		        return true;  
		    } else {  
		        return false;  
		    }  
		},
		_interlaceRow : function(){
			var allRows = $(".datagrid-row:odd");
			allRows.css("background-color","rgb(224, 232, 255)");//隔行变色
		}
	});
})(window,jQuery);

 

参数说明 listLoadingMore({id:"",id2:function(){},action:function(){},pageNum:10,getNew:undefined,funcArg:undefined,func:function(){},loadingMustTime:0,loadingDom:function(){},loadedDom:function(){},nullDataFunc:function(){},endFunc:function(){},errorFunc:function(){}}); id:滚动条id,不可以是body; id2:滚动列表的id,通过function自行根据情况返回; action:数据来源的ajax地址,插件会自动加上page和length(分别表示请求页数和当前已有记录数),返回格式统一是[{},{}...],此类jsonArray; ajaxType:ajax提交方式,将更改传递数据的方式,默认post; pageNum:每页加载数量,将会根据这个数量判断是否全部加载完成; getNew:自定义获取数据方法; funcArg:自定义获取数据时传递的参数,类型为函数,返回所需参数; childrenTag:列表子项的标签,默认LI; func:非自定义获取数据时,创建每行数据的方法; loadingMustTime:强制最小加载时间,默认0; loadingDom:加载中动画自定义,返回Dom或者HTML代码; loadedDom:完全加载完成动画自定义,返回Dom或者HTML代码; nullDataFunc:数据列表为空时执行的方法; endFunc:每页数据加载完成时执行的方法; errorFunc:ajax获取数据失败时调用的方法。 回调方法 调用本方法初始化后将会得到一个专属的方法集: Object {getNew:function,isFull:function,isRunning:function,isStop:function,loading:function,show:function}; getNew():忽略判断条件,强制执行加载操作。此时数据传递中,page值可能出错,但length值一定正确,请谨慎判断后在执行该方法; isFull(boolean):修改列表加载完成标志。true为全部加载完成,false则相反; isRunning(boolean):修改列表当前是否正在加载中标志。几乎没有使用的机会; isStop(boolean):设置是否停止加载,设置为true时将会阻止未来的所有加载操作; loading():根据当前滚动条的位置,自动判断是否需要加载新数据; show(boolean,boolean):强制设置加载中和加载完成dom的显示或隐藏,true表示显示,false相对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值