H5移动端网页上拉及下拉刷新数据

H5移动端网页上拉及下拉刷新数据

上拉刷新demo 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Document</title>
	<style type="text/css">
		html,body,header,div,main,p,span,ul,li{ margin: 0; padding: 0; }
		#refreshContainer li{ background-color: #eee; margin-bottom: 1px; padding: 20px 10px; }
		.refreshText{ position: absolute; width: 100%; line-height: 50px; text-align: center; left: 0; top: 0; }
	</style>
</head>
<body>
<main>
	<p class="refreshText"></p>
	<ul id="refreshContainer">
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
	</ul>
</main>

<script type="text/javascript">
	(function(window) {
		var _element = document.getElementById('refreshContainer'),
		  _refreshText = document.querySelector('.refreshText'),
		  _startPos = 0,
		  _transitionHeight = 0;

		_element.addEventListener('touchstart', function(e) {
			console.log('初始位置:', e.touches[0].pageY);
			_startPos = e.touches[0].pageY;
			_element.style.position = 'relative';
			_element.style.transition = 'transform 0s';
		}, false);
		
		_element.addEventListener('touchmove', function(e) {
			console.log('当前位置:', e.touches[0].pageY);
			_transitionHeight = e.touches[0].pageY - _startPos;
			
			if (_transitionHeight > 0 && _transitionHeight < 60) {
				_refreshText.innerText = '下拉刷新';
				_element.style.transform = 'translateY('+_transitionHeight+'px)';

				if (_transitionHeight > 55) {
				  _refreshText.innerText = '释放更新';
				  _element.append("<li>100</li>");
				}
			}				
		}, false);

		_element.addEventListener('touchend', function(e) {
			_element.style.transition = 'transform 0.5s ease 1s';
			_element.style.transform = 'translateY(0px)';
			_refreshText.innerText = '更新中...';

			// todo...

		}, false);
	})(window);
</script>
</body>
</html>

下拉加载更多demo

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Document</title>
	<style type="text/css">
		html,body,header,div,main,p,span,ul,li{ margin: 0; padding: 0; }
		#refreshContainer li{ background-color: #eee; margin-bottom: 1px; padding: 20px 10px; }
		.refreshText{ line-height: 50px; text-align: center; }
	</style>
</head>
<body>
<main>
	<ul id="refreshContainer">
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
		<li>111</li>
		<li>222</li>
		<li>333</li>
		<li>444</li>
		<li>555</li>
	</ul>
	<p class="refreshText"></p>
</main>

<script type="text/javascript">
(function(window) {
	// 获取当前滚动条的位置 
    function getScrollTop() { 
	    var scrollTop = 0; 
	    if (document.documentElement && document.documentElement.scrollTop) { 
	    	scrollTop = document.documentElement.scrollTop; 
	    } else if (document.body) { 
	    	scrollTop = document.body.scrollTop; 
	    } 
	    return scrollTop; 
    } 

    // 获取当前可视范围的高度 
    function getClientHeight() { 
	    var clientHeight = 0; 
	    if (document.body.clientHeight && document.documentElement.clientHeight) { 
	    	clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight); 
	    } 
	    else { 
	    	clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight); 
	    } 
	    return clientHeight; 
    }

    // 获取文档完整的高度 
    function getScrollHeight() { 
    	return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); 
    }

    var _text = document.querySelector('.refreshText'),
    _container = document.getElementById('refreshContainer');

    var throttle = function(method, context){
		  clearTimeout(method.tId);
		  method.tId = setTimeout(function(){
		    method.call(context);
		  }, 300);
	}

    function fetchData() {
    	setTimeout(function() {
    		_container.insertAdjacentHTML('beforeend', '<li>new add...</li>');
    	}, 1000);
    }

    window.onscroll = function() {
      	if (getScrollTop() + getClientHeight() == getScrollHeight()) {
      		_text.innerText = '加载中...';
      		throttle(fetchData);
      	}
    };

})(window);
</script>
</body>
</html>

由于上面的demo针对是单页面且针对整个页面区,所以很多时候不大适合,下面这个例子是针对 div区域做的下拉刷新

滚动区域为div 的下拉刷新 demo

注:该demo相关的几个文件未给出,但关键代码已贴

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>下拉刷新-移动端</title>

    <script src="jscript/jquery-1.11.0.min.js" type="text/javascript"></script>
    <script src="jscript/util.js" type="text/javascript"></script>
    <script src="jscript/publish.js" type="text/javascript"></script>

    <link rel="stylesheet" href="css/mbase.css">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <style>
        .refreshText {
            line-height: 50px;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="header">
        <div style="width:10%;float:left; text-align:center; vertical-align:central;"><img src="mimages/nconlogo.png" style="width:75px;height:75px;"></div>
        <div style="width:75%;float:right; margin-left:10px;">
            <div class="nav">
                <a href="#" οnclick="sel(this,2);">平面口罩</a>
            </div>
        </div>

    </div>
    <div class="content"  id="div2">
        <p style="text-align:center;font-size:18px;margin-bottom:5px;margin-top:5px;">平面口罩</p>
        <div id="wraper1" style="overflow-y:auto; height:75vh;">
                <div style="margin-left:5px; " id="infoData2">
                    暂无信息
                </div>
                <p class="refreshText" id="refreshText1"></p>
        </div>
    </div>
    <div class="footer">
        <p>下拉刷新测试</p>
    </div>

    <script type="text/javascript">

        var content = document.getElementById('wraper1');    //滑动容器
        var _text = document.getElementById('refreshText1');

        (function (window) {
            $("#btnOk").click(function () {
                publish();
            });
            
            // 获取当前滚动条的位置
            function getScrollTop() {
                var scrollTop = 0;
                if (document.documentElement && content.scrollTop) {
                    scrollTop = content.scrollTop;
                } else if (document.body) {
                    scrollTop = document.body.scrollTop;
                }
                return scrollTop;
            }

            // 获取当前可视范围的高度
            function getClientHeight() {
                var clientHeight = 0;
                if (document.body.clientHeight && content.clientHeight) {
                    clientHeight = Math.min(document.body.clientHeight, content.clientHeight);
                }
                else {
                    clientHeight = Math.max(document.body.clientHeight, content.clientHeight);
                }
                return clientHeight;
            }

            // 获取文档完整的高度
            function getScrollHeight() {
                return Math.max(document.body.scrollHeight, content.scrollHeight);
            }

            var throttle = function (method, context) {
                clearTimeout(method.tId);
                method.tId = setTimeout(function () {
                    method.call(context);
                }, 500);
            }

            function fetchData() {
                setTimeout(function () {
                    //_container.insertAdjacentHTML('beforeend', '<li>new add...</li>');
                    pageIndex++;
                    getconinfoData(pageIndex, SmallpageSize);
                    //alert("loading " + pageIndex+" 页 typeid="+CurrentTypeId);
                }, 1000);
            }
            ////////////
            

            // 触摸开始
            function boxTouchStart(e) {
                var touch = e.touches[0];
                startY = touch.pageY;
            }

            // 触摸移动
            function boxTouchMove(e) {
                var touch = e.touches[0];
                moveY = touch.pageY - startY;
                index = Number(e.target.id.split('page')[1])

                var htop = getScrollTop();
                var hch = getClientHeight();
                var sch = getScrollHeight();
                if (htop + hch >= sch) {
                    _text.innerText = '加载中...';
                    throttle(fetchData);
                }
            }

            content.addEventListener('touchstart', boxTouchStart, false)
            content.addEventListener('touchmove', boxTouchMove, false)

        })(window);
    </script>
    <script>

        function sel(fromobj, val) {
            //alert(val);
            CurrentTypeId = 2;
            $(".nav a").removeClass("active");
            $(fromobj).addClass("active");
            getconinfoData(pageIndex, SmallpageSize);
        }
    </script>
</body>
</html>

getconinfoData为加载数据的js

function getconinfoData(idx, size) {
    var val = CurrentTypeId;
    var typeId = parseInt(val) * 100;
   
    if (idx == 1) {
        //先清空
        $($("#infoData" + val)).html("");
    }

    var data = {};
    data.call = ReqDefaultInfo;
    var url = ReqDefaultDomain + "cov/list?typeId=" + typeId + "&pageIndex=" + idx + "&pageSize=" + size
    ajaxProcessForApi(url, data.call, function callSuccess(oRet) {
        var result = oRet.Data;
        var html = "";
        var tr = "<div class='listdata'><ul><li>产品名称:{PName}</li><li>注册证号:{RegisterNo}</li><li class='publisher'>注册人:{RegisterName}</li></ul></div>";
        
        $(result.Rows).each(function () {
            html += tr.format(this);
        });
        if (html.length < 10) {
            html = "暂无信息";
            $($("#refreshText" + val)).innerText = "已经到底了...";
        }
        $($("#infoData" + val)).append(html);

    }, function callError(e) {
        //alert(e);
    });
}

页面绑定事件时加入了节流函数,其作用就是忽略滚动条300毫秒内的连续多次触发。

小结
上拉刷新的实现主要依靠的是touch事件的三个阶段,以及借助CSS3动画效果;下拉加载主要依靠页面的boxTouchMove事件,需要注意的是页面滚动时可能要考虑函数节流。

--- end ---

发布了285 篇原创文章 · 获赞 492 · 访问量 389万+

猜你喜欢

转载自blog.csdn.net/huwei2003/article/details/105638828