pullToRefreshHelper.js 1.56 KB
define(function() {
  var state = {
    REFRESHING: 'refreshing',
    RELEASING: "releasing"
  };
  var _default = {
    el: null, // 上划元素
    container: document.body, // el往上有scroll的父级
    loading: {
      show: function () { },
      hide: function () { }
    },
    loadData: function () { }
  };
  var _ = {
    shouldPullToRefresh: function (el) {
      return el.scrollTop > 1 && el.scrollHeight - el.scrollTop - el.offsetHeight < 1;
    },
    namespace: function (evtName) {
      return evtName + ".pullToRefresh";
    },
  };

  var PullToRefresh = function PullToRefresh (options) {
    var ptrf = this;
    var ns = function (evtName) {
      return _.namespace(evtName);
    };
    var opts = $.extend({}, _default, options);
    var container = opts.container;

    this.state = state.RELEASING;
    this.updateState = function (st) {
      this.state = st;
    };
    this.destory = function () {
      $(container).off(ns('scroll'));
    };

    $(container).off(ns('scroll'))
      .on(ns('scroll'), _onScroll);

    function _onScroll(e) {
      if (state.RELEASING !== ptrf.state) return;

      var shouldPullToRefresh = _.shouldPullToRefresh(container);

      e.preventDefault();
      e.stopPropagation();

      if (!shouldPullToRefresh) return;

      opts.loading.show();
      ptrf.updateState(state.REFRESHING);
      opts.loadData(function (hasMore) {
        opts.loading.hide.apply(opts.loading, arguments);

        if (!hasMore) return ptrf.destory();

        ptrf.updateState(state.RELEASING);
      });
    }
  };

  return PullToRefresh;
});