js上拉加载、下拉刷新的插件
之前在网上找那种下拉刷新,上拉加载的插件,有一款IScroll,但是用起来太麻烦,于是就自己写了款,但依赖于jquery.js,bug肯定有,希望评论提出。
推荐一个简洁且文档的插件:传送门
因为我这个不算一个很稳定的东西,只是大概能用
js:
/*
    简洁的下拉刷新,上拉加载插件
    Author:myEsn2E9
    QQ:865540141
    Date:2016-5-17
*/
; !(function () {
    var defaultParame = {
        positionY: 0,
        positionTop: 0,
        positionBottom: 0,
        screenY: 0,
        topSpeed: .6,
        animateSpeed: 800,
        whenThisHeightExecuteCallback: 50,
        refreshDom: {
            prop: '.refresh',
            startText: '下拉刷新',
            ingText: '更新中',
            endText: '释放更新'
        },
        loadDom: {
            prop: '.load',
            startText: '上拉加载',
            ingText: '加载中',
            endText: '释放加载'
        },
        isStartRefresh: false,
        isStartLoad: false,
        isRefreshIng: false,
        isLoadIng: false,
        moveArray: new Array(),
        continueMoveDirection: '',
        loadImg: {
            src: 'data:image/gif;base64,R0lGODlhIAAgALMAAP///7Ozs/v7+9bW1uHh4fLy8rq6uoGBgTQ0NAEBARsbG8TExJeXl/39/VRUVAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQAAACwAAAAAIAAgAAAE5xDISSlLrOrNp0pKNRCdFhxVolJLEJQUoSgOpSYT4RowNSsvyW1icA16k8MMMRkCBjskBTFDAZyuAEkqCfxIQ2hgQRFvAQEEIjNxVDW6XNE4YagRjuBCwe60smQUDnd4Rz1ZAQZnFAGDd0hihh12CEE9kjAEVlycXIg7BAsMB6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YEvpJivxNaGmLHT0VnOgGYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHQjYKhKP1oZmADdEAAAh+QQFBQAAACwAAAAAGAAXAAAEchDISasKNeuJFKoHs4mUYlJIkmjIV54Soypsa0wmLSnqoTEtBw52mG0AjhYpBxioEqRNy8V0qFzNw+GGwlJki4lBqx1IBgjMkRIghwjrzcDti2/Gh7D9qN774wQGAYOEfwCChIV/gYmDho+QkZKTR3p7EQAh+QQFBQAAACwBAAAAHQAOAAAEchDISWdANesNHHJZwE2DUSEo5SjKKB2HOKGYFLD1CB/DnEoIlkti2PlyuKGEATMBaAACSyGbEDYD4zN1YIEmh0SCQQgYehNmTNNaKsQJXmBuuEYPi9ECAU/UFnNzeUp9VBQEBoFOLmFxWHNoQw6RWEocEQAh+QQFBQAAACwHAAAAGQARAAAEaRDICdZZNOvNDsvfBhBDdpwZgohBgE3nQaki0AYEjEqOGmqDlkEnAzBUjhrA0CoBYhLVSkm4SaAAWkahCFAWTU0A4RxzFWJnzXFWJJWb9pTihRu5dvghl+/7NQmBggo/fYKHCX8AiAmEEQAh+QQFBQAAACwOAAAAEgAYAAAEZXCwAaq9ODAMDOUAI17McYDhWA3mCYpb1RooXBktmsbt944BU6zCQCBQiwPB4jAihiCK86irTB20qvWp7Xq/FYV4TNWNz4oqWoEIgL0HX/eQSLi69boCikTkE2VVDAp5d1p0CW4RACH5BAUFAAAALA4AAAASAB4AAASAkBgCqr3YBIMXvkEIMsxXhcFFpiZqBaTXisBClibgAnd+ijYGq2I4HAamwXBgNHJ8BEbzgPNNjz7LwpnFDLvgLGJMdnw/5DRCrHaE3xbKm6FQwOt1xDnpwCvcJgcJMgEIeCYOCQlrF4YmBIoJVV2CCXZvCooHbwGRcAiKcmFUJhEAIfkEBQUAAAAsDwABABEAHwAABHsQyAkGoRivELInnOFlBjeM1BCiFBdcbMUtKQdTN0CUJru5NJQrYMh5VIFTTKJcOj2HqJQRhEqvqGuU+uw6AwgEwxkOO55lxIihoDjKY8pBoThPxmpAYi+hKzoeewkTdHkZghMIdCOIhIuHfBMOjxiNLR4KCW1ODAlxSxEAIfkEBQUAAAAsCAAOABgAEgAABGwQyEkrCDgbYvvMoOF5ILaNaIoGKroch9hacD3MFMHUBzMHiBtgwJMBFolDB4GoGGBCACKRcAAUWAmzOWJQExysQsJgWj0KqvKalTiYPhp1LBFTtp10Is6mT5gdVFx1bRN8FTsVCAqDOB9+KhEAIfkEBQUAAAAsAgASAB0ADgAABHgQyEmrBePS4bQdQZBdR5IcHmWEgUFQgWKaKbWwwSIhc4LonsXhBSCsQoOSScGQDJiWwOHQnAxWBIYJNXEoFCiEWDI9jCzESey7GwMM5doEwW4jJoypQQ743u1WcTV0CgFzbhJ5XClfHYd/EwZnHoYVDgiOfHKQNREAIfkEBQUAAAAsAAAPABkAEQAABGeQqUQruDjrW3vaYCZ5X2ie6EkcKaooTAsi7ytnTq046BBsNcTvItz4AotMwKZBIC6H6CVAJaCcT0CUBTgaTg5nTCu9GKiDEMPJg5YBBOpwlnVzLwtqyKnZagZWahoMB2M3GgsHSRsRACH5BAUFAAAALAEACAARABgAAARcMKR0gL34npkUyyCAcAmyhBijkGi2UW02VHFt33iu7yiDIDaD4/erEYGDlu/nuBAOJ9Dvc2EcDgFAYIuaXS3bbOh6MIC5IAP5Eh5fk2exC4tpgwZyiyFgvhEMBBEAIfkEBQUAAAAsAAACAA4AHQAABHMQyAnYoViSlFDGXBJ808Ep5KRwV8qEg+pRCOeoioKMwJK0Ekcu54h9AoghKgXIMZgAApQZcCCu2Ax2O6NUud2pmJcyHA4L0uDM/ljYDCnGfGakJQE5YH0wUBYBAUYfBIFkHwaBgxkDgX5lgXpHAXcpBIsRADs=',
            style: 'width: 15px; height: 15px; vertical-align: middle;'
        }
    },
    parame = {},
    prop = ''
    callback = {
        refresh: null,
        load: null
    };
    function createDom() {
        var defaultcss = 'height: 0; display: none; text-align: center; font-size: 12px; ';
        $('<div class="' + parame.refreshDom.prop.replace('.', '') + '" style="' + defaultcss + '">' + parame.refreshDom.startText + '</div>').insertBefore($(prop));
        $('<div class="' + parame.loadDom.prop.replace('.', '') + '" style="' + defaultcss + '">' + parame.loadDom.startText + '</div>').insertAfter($(prop));
    }
    var method = {
        refreshMove: function () {
            if (parame.isStartLoad) {
                console.log('已经在加载了,不能刷新');
                return;
            }
            console.log('刷新开始');
            parame.isStartRefresh = true;
            (parame.continueMoveDirection === 'top') && (parame.positionTop -= parame.topSpeed);
            (parame.continueMoveDirection === 'bottom') && (parame.positionTop += parame.topSpeed);
            $(prop).prev(parame.refreshDom.prop).fadeIn(parame.animateSpeed);
            $(prop).css({ 'position': 'relative' }).animate({ 'top': parame.positionTop }, 0);
            $(prop).prev(parame.refreshDom.prop)
                .text(parame.positionTop >= parame.whenThisHeightExecuteCallback
                ? parame.refreshDom.endText : parame.refreshDom.startText);
        },
        loadMove: function () {
            if (parame.isStartRefresh) {
                console.log('已经在刷新了,不能加载');
                return;
            }
            parame.isStartLoad = true;
            console.log('加载开始');
            (parame.continueMoveDirection === 'top') && (parame.positionBottom += parame.topSpeed);
            (parame.continueMoveDirection === 'bottom') && (parame.positionBottom -= parame.topSpeed);
            $(prop).next(parame.loadDom.prop).fadeIn(parame.animateSpeed);
            $(prop).css({ 'position': 'relative' }).animate({ 'bottom': parame.positionBottom }, 0);
            $(prop).next(parame.loadDom.prop)
                    .text(parame.positionBottom >= parame.whenThisHeightExecuteCallback
                    ? parame.loadDom.endText : parame.loadDom.startText);
        },
        closeRefresh: function () {
            parame.isStartRefresh = parame.isRefreshIng = false;
            parame.positionTop = 0;//重置偏移量
            parame.continueMoveDirection = '';
            parame.moveArray = new Array();
            $(prop).animate({ 'top': 0 }, parame.animateSpeed, function () {
                $(prop).removeAttr('style').prev(parame.refreshDom.prop).fadeOut(parame.animateSpeed);
                console.log('刷新结束');
            });
        },
        closeLoad: function () {
            parame.isStartLoad = parame.isLoadIng = false;
            parame.positionBottom = 0;//重置偏移量
            parame.continueMoveDirection = '';
            parame.moveArray = new Array();
            $(prop).animate({ 'bottom': 0 }, parame.animateSpeed, function () {
                $(prop).removeAttr('style').next(parame.loadDom.prop).fadeOut(parame.animateSpeed);
                console.log('加载结束');
            });
        },
        refreshIng: function () {
            console.log(parame.refreshDom.ingText);
            parame.isStartRefresh = parame.isRefreshIng = true;
            $(prop).prev(parame.refreshDom.prop)
                .html('<img src="' + parame.loadImg.src + '" style="' + parame.loadImg.style + '"/>' + parame.refreshDom.ingText);
            $(prop).css({ 'position': 'relative' }).animate({ 'top': parame.whenThisHeightExecuteCallback }, parame.animateSpeed);
            callback.refresh();
        },
        loadIng: function () {
            console.log(parame.loadDom.ingText);
            parame.isStartLoad = parame.isLoadIng = true;
            $(prop).next(parame.loadDom.prop)
                .html('<img src="' + parame.loadImg.src + '" style="' + parame.loadImg.style + '"/>' + parame.refreshDom.ingText);
            $(prop).css({ 'position': 'relative' }).animate({ 'bottom': parame.whenThisHeightExecuteCallback }, parame.animateSpeed);
            callback.load();
        },
        cancel: function () {
            console.log('滑动时受到了伤害');
            parame.isStartRefresh = parame.isStartLoad = parame.isRefreshIng = parame.isLoadIng = false;
            parame.positionTop = parame.positionBottom = 0;//重置偏移量
            parame.continueMoveDirection = '';
            parame.moveArray = new Array();
            $(prop).animate({ 'top': 0, 'bottom': 0 }, parame.animateSpeed, function () {
                $(prop).removeAttr('style');
                $(prop).prev(parame.refreshDom.prop).fadeOut(parame.animateSpeed);
                $(prop).next(parame.loadDom.prop).fadeOut(parame.animateSpeed);
            });
        },
        isRefreshBug: function () {
            return !parame.isRefreshIng
                && $(prop).prev(parame.refreshDom.prop).css('display') != 'none'
                && parame.positionTop < parame.whenThisHeightExecuteCallback;
        },
        isLoadBug: function () {
            return !parame.isLoadIng
                && $(prop).next(parame.loadDom.prop).css('display') != 'none'
                && parame.positionBottom < parame.whenThisHeightExecuteCallback;
        }
    };
    function event() {
        $(prop).unbind('touchstart touchmove touchend touchcancel')
        .on('touchstart', function (e) {
            console.log('开始滑动');
            parame.screenY = e.originalEvent.targetTouches[0].screenY;
        })
        .on('touchmove', function (e) {
            console.log('滑动中');
            if (parame.isRefreshIng || parame.isLoadIng) {
                console.log('已经在刷新/加载了,禁止滑动');
                return;
            }
            parame.positionY = window.scrollY;
            parame.moveArray.push(e.originalEvent.targetTouches[0].screenY);
            if (parame.moveArray.length > 1) {
                if (e.originalEvent.targetTouches[0].screenY > parame.moveArray[parame.moveArray.length - 2]) {//-2是因为本次移动的y轴数值位于该数组的最后一位
                    parame.continueMoveDirection = 'bottom';
                } else if (e.originalEvent.targetTouches[0].screenY < parame.moveArray[parame.moveArray.length - 2]) {
                    parame.continueMoveDirection = 'top';
                } else {
                    parame.continueMoveDirection = '';
                }
            } else {
                parame.continueMoveDirection = '';
            }
            console.log(parame.continueMoveDirection);
            if (parame.positionY === 0 && (($(document).height() - $(window).height()) == 0)) {//没有滚动条的时候
                //刷新
                console.log('刷新么么-无滚动条');
                (parame.isStartRefresh || parame.continueMoveDirection === 'bottom') && method.refreshMove();
                //加载
                console.log('加载么么-无滚动条');
                (parame.isStartLoad || parame.continueMoveDirection === 'top') && method.loadMove();
            } else {
                //刷新
                console.log('刷新么么-有滚动条');
                (parame.positionY === 0
                    && !parame.isStartLoad
                    && parame.continueMoveDirection === 'bottom')
                && method.refreshMove();
                //加载
                console.log('加载么么-有滚动条');
                ((parame.positionY === ($(document).height() - $(window).height()))
                    && parame.continueMoveDirection === 'top'
                    && !parame.isStartRefresh)
                && method.loadMove();
            }
        })
        .on('touchend', function () {
            console.log('滑动结束');
            //刷新
            parame.positionTop >= parame.whenThisHeightExecuteCallback && method.refreshIng();
            //加载
            parame.positionBottom >= parame.whenThisHeightExecuteCallback && method.loadIng();
            //解决滑动距离小于刷新/加载距离未重置的bug
            method.isRefreshBug() && method.closeRefresh();
            method.isLoadBug() && method.closeLoad();
        })
        .on('touchcancel', function () {
            method.cancel();
        });
    }
    function init() {
        createDom();
        event();
    }
    window.noName = {
        /*
            config:{
                //主要参数
                prop:'',//dom元素
                refreshCallback:function(){},//刷新回调
                loadCallback:function(){}//加载回调
                //其他想自定义的参数请看defaultParame变量
            }
        */
        init: function (config) {
            prop = config.prop;
            if (typeof (config.prop) === 'undefined'
                || config.prop === ''
                || typeof (config.refreshCallback) != 'function'
                || typeof (config.loadCallback) != 'function')
                throw new Error('必需参数为空');
            callback.refresh = config.refreshCallback;
            callback.load = config.loadCallback;
            parame = $.extend({}, defaultParame, config.config || {});
            init();
        },
        //刷新完成后关闭
        closeRefresh: method.closeRefresh,
        //加载完成后关闭
        closeLoad: method.closeLoad
    };
}());html:
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>index</title>
    <link href="~/Content/css/comm/reset.css" rel="stylesheet" />
    <style>
        #content {
            width: 100%;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div class="wrapper" id="wrapper">
        <div id="content"></div>
    </div>
    <script src="~/Content/js/comm/jquery.min.js"></script>
    <script src="~/Content/js/comm/noName.js"></script>
    <script>
        function fillData() {
            var content = '';
            for (var i = 0; i < 5; i++) {
                content += '<p>这里就是内容' + i + '</p>';
            }
            $('#content').append(content);
        }
        fillData();
        noName.init({
            prop: '',
            refreshCallback: function () {
                setTimeout(function () {
                    $('#content').html('');
                    fillData();
                    noName.closeRefresh();
                }, 3000)
            },
            loadCallback: function () {
                setTimeout(function () {
                    fillData();
                    noName.closeLoad();
                }, 3000)
            }
        });
    </script>
</body>
</html>js上拉加载、下拉刷新的插件的更多相关文章
- 微信小程序上拉加载下拉刷新
		微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ... 
- Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记
		之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ... 
- 上拉加载下拉刷新控件WaterRefreshLoadMoreView
		上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ... 
- RecyclerView 上拉加载下拉刷新
		RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ... 
- APICloud上啦加载下拉刷新模块
		apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ... 
- mui scroll和上拉加载/下拉刷新
		mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/* */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ... 
- js上拉加载下拉刷新
		写在前边: 工作需要,使用ajax在原来的列表下边使用ajax请求后台数据,拼接在列表最下边,在github转了好久,发现了一个bug极多的js刷新插件,尝试了一个下午,就在快放弃的时候,发现下边有留 ... 
- 移动端上拉加载下拉刷新插件-mescroll.js插件
		官网地址是:http://www.mescroll.com // 初始化mescroll function initMeScroll() { //创建MeScroll对象,内部已默认开启下拉刷新,自动 ... 
- zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面
		<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ... 
- 利用iscroll实现上拉加载下拉刷新
		1.首先引用isScroll插件 说明:页面加载时初始化isScroll,然后调用pullDownAction()和pullUpAction(),每次切换tab时,只需要对pullDownAction ... 
随机推荐
- 微信小应用vs progressive-web-apps
			https://developers.google.com/web/progressive-web-apps/ 
- css水平居中的小小探讨
			水平居中是常用的几种布局方式之一.主要分为行内元素的居中,块元素的居中.块元素的居中还分为固定宽度的居中,不定宽度的居中.行内元素的居中,使用text-align:center就可以实现,已知宽度的块 ... 
- Mysql软删除
			所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ... 
- hadoop+eclipse集群搭建及测试
			前段时间搭了下hadoop,每次都会碰到很多问题,也没整理过,每次搜索都麻烦,现在整理下 一.准备工作 1.准备俩计算机,安装linux系统,分别装好jdk(虚拟机操作一样) nano /etc/ho ... 
- java获取天气信息
			通过天气信息接口获取天气信息,首先要给项目导入程序所需要的包,具体需要如下几个包: json-lib-2.4.jar ezmorph-1.0.6.jar commons-beanutils-1.8.3 ... 
- PHP之路——PHPExcel使用
			aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGMAAAJkCAIAAAA6GnvRAAAgAElEQVR4nOzd918bV/ov8Pv33Y2RNC 
- android 休眠唤醒机制分析(二) — early_suspend
			本文转自:http://blog.csdn.net/g_salamander/article/details/7982170 early_suspend是Android休眠流程的第一阶段即浅度休眠,不 ... 
- 转:Redis作者谈Redis应用场景
			毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ... 
- 【HDOJ】4982 Goffi and Squary Partition
			题意就是整数划分,选出和为n的K个整数,其中K-1个数的和为完全平方数S.选择整数时需要从1,2,3..连续选择,当选择整数与n-S相等时,需要跳过n-S,即选择n-S+1.如此选择K-2个数,从而可 ... 
- 【宽搜】【并查集】Vijos P1015 十字绣
			题目链接: https://vijos.org/p/1015 题目大意: n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面.每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中 ... 
