zoukankan      html  css  js  c++  java
  • 使用js实现上拉加载下拉刷新效果

    在实际的移动端开发中,经常会使用到刷新与加载的功能。使用一些成熟的控件既能节约开发时间,又能增强代码的稳定性。本文介绍的是常用的关于移动端滚动和刷新与加载的控件。

    iScroll的产生完全是因为移动版webkit浏览器,例如在iPhone,Android 的移动设备上。

    iScroll的原理是外层有一个溢出隐藏(overflow:hidden;)的DOM,然后这个区域内的第一个DOM结构会被实例化,其包裹的内容可以纵向或者横向的滚动,所以在使用iScroll的时候,滚动元素要尽量的简单,减少DOM个数,减少嵌套,因为DOM结构越是复杂iScroll运行起来就越是吃力,有可能会造成某些节点显示不正常的情况。 所以,推荐使用的DOM结构如下:

    <div id="wrapper">
      <ul>
        <li>row 11</li>
        <li>row 10</li>
        <li>row 9</li>
        <li>row 8</li>
        <li>row 7</li>
        <li>row 6</li>
        <li>row 5</li>
        <li>row 4</li>
        <li>row 3</li>
        <li>row 2</li>
        <li>row 1</li>
      </ul>
    </div>

    注意:只有wrapper里的第一个子元素(ul)才可以被实例化滚动,并且要结合外层的DOM(wrapper)才能实现滚动。如果 wrapper中有多个ul,只有wrapper里的第一个子元素(ul)才可以被实例化滚动。

    在JS插入页面DOM结构和数据之前实例化iScroll,也就是在JS的最开始实例化,因为之后可能会使用JS来插入DOM或者数据,这样以来能确保在插入数据之前iScroll已经实例化了。

    关于iScroll详细用法不过多讲,后面会给到常用的api,然后是和pullToRefresh结合使用,达到我们想要的效果。

    <!DOCTYPE html>
    <html>
    <head>
    <title>pull to refresh</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="stylesheet" href="pullToRefresh.css"/>
    <script src="iscroll.js"></script>
    <script src="pullToRefresh.js"></script>
    <style type="text/css" media="all">
    body, html {
        padding: 0;
        margin: 0;
        height: 100%;
        font-family: Arial, Helvetica, sans-serif;
    }
    </style>
    </head>
    <body>
    <!--must content ul-->
    <div id="wrapper">
      <ul>
        <li>row 11</li>
        <li>row 10</li>
        <li>row 9</li>
        <li>row 8</li>
        <li>row 7</li>
        <li>row 6</li>
        <li>row 5</li>
        <li>row 4</li>
        <li>row 3</li>
        <li>row 2</li>
        <li>row 1</li>
      </ul>
    </div>
    <script>
    refresher.init({
        id:"wrapper",
        pullDownAction:Refresh, /*下拉刷新*/
        pullUpAction:Load /*上拉加载*/
        });
    var generatedCount = 0;
    function Refresh() {
        setTimeout(function () {    //  模拟网络阻塞, 移除定时器
            var el, li, i;
            el =document.querySelector("#wrapper ul");
            el.innerHTML='';
            for (i=0; i<11; i++) {
                li = document.createElement('li');
                li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
                el.insertBefore(li, el.childNodes[0]);
            }    
            myScroll.refresh();/******操作成后一定要记得刷新*****/
        }, 1000);
    }
    function Load() {
        setTimeout(function () {    //   模拟网络阻塞, 移除定时器
            var el, li, i;
            el =document.querySelector("#wrapper ul");
            for (i=0; i<2; i++) {
                li = document.createElement('li');
                li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
                el.appendChild(li, el.childNodes[0]);
            }
            myScroll.refresh();/******操作成后一定要记得刷新*****/
        }, 1000);
    }
    </script>
    </body>
    </html>

    以上为上下拉时候的效果,上拉加载后就会依次往下增加ul的长度(因为增加了li),下拉刷新则只会显示最新的11条信息。

    iScroll中的参数:

    在实例化iScroll的时候,可以传入两个参数,第一个参数是实例化的外层的DOM的ID,第二个参数是iScroll执行方法的对象:

    第二个参数内容如下,这个参数会控制iScroll的效果:

    hScroll        false 禁止横向滚动 true横向滚动 默认为true
    vScroll        false 禁止垂直滚动 true垂直滚动 默认为true
    hScrollbar     false隐藏水平方向上的滚动条
    vScrollbar     false 隐藏垂直方向上的滚动条
    fadeScrollbar  false 指定在无渐隐效果时隐藏滚动条
    hideScrollbar  在没有用户交互时隐藏滚动条 默认为true
    bounce         启用或禁用边界的反弹,默认为true
    momentum       启用或禁用惯性,默认为true,
                   此参数在你想要保存资源的时候非常有用
    lockDirection  false取消拖动方向的锁定,
                   true拖动只能在一个方向上(up/down 或者left/right)

    当然在第二个参数中,也有一些方法可以执行:

    (1)scrollTo(x, y, time, relative)方法:传入4个参数:X轴滚动距离,Y轴滚动距离,效果时间,是否相对当前位置。
    (2)refresh()方法:在DOM结构发生改变之后,需要刷新iScroll,否则滚动插件会实例化的不准确
    (3)onPosChange,有没有一个方法能返回位置的变化?你可以查询一下自己所用的iScroll中有没有onPosChange方法
    (4)onScrollEnd:滚动结束时执行的事件,如果想在滚动结束时出发摸个事件,这个方法就拍上用处了
    (5)onRefresh:在DOM结构发生改变之后,需要刷新iScroll,否则滚动插件会实例化的不准确,onRefresh是刷新完iScroll会执行的方法。
    (6)onBeforeScrollStart:开始滚动前的时间回调,默认是阻止浏览器默认行为 。
    (7)onScrollStart:开始滚动的回调。
    (8)onBeforeScrollMove:在内容移动前的回调。
    (9)onScrollMove:内容移动的回调。
    (10)onBeforeScrollEnd:在滚动结束前的回调。
    (11)onTouchEnd:手离开屏幕后的回调。
    (12)onDestroy:销毁实例的回调。
  • 相关阅读:
    QAU 18校赛 J题 天平(01背包 判断能否装满)
    滚动数组
    Leapin' Lizards HDU
    Sabotage UVA
    Food HDU
    两个Button 加通一个手势,那么 第一个的就失效了,
    终于把聊天记录保存到数据库当中去了,
    添加好友,
    XEP 0055 (Jabber search) with iphone SDK
    手机ip,
  • 原文地址:https://www.cnblogs.com/asituhaitang/p/7170207.html
Copyright © 2011-2022 走看看