一看就懂,js插件编写,以手机H5分页举例

巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。
这是对的,但是我没有说过这句话! —— 鲁迅

整理一下js插件的编写,这里以手机端H5分页举例。
即一共有1000条数据,每次只加载20条,当滑到底端的时候再默认加载20条,直到将所有数据加载完成。

封装性

将自己的代码隔开,使其他代码不会受到任何影响。

(function (win,$) {

})(window,$);

$是Jquery,window的作用是将自己写的插件暴露出来,让window可以直接调用.

组成部分

定义一个插件名,包括要传输的参数,即一个类的定义。

定义插件,也是要在这里进行参数传递。

/***
  * 插件名,首字母大写,可以向对待类一样对待,如:new MobilePage()
  * @param url 要请求的地址
  * @param type get,post,put等
  * @param data 要传输的数据.
  * @param callcack success后要执行的函数.
  */
 var MobilePage = function (options) {
     this.url = options.url;
     this.type = options.type;
     this.data = options.data;
     this.callback = options.callcack;
     this.pageParams = {
         //对应 sql中的 limit(0,3)
         start:0,
         length:3
     };
     //当次请求的数据长度,有可能=pageParams.length ,也有可能 < pagePaarams.length(最后一页)
     this.dataLength = this.pageParams.length;
     this.dataTotal;//记录一下数据的总长度
 }

给插件增加方法

对插件添加方法,添加方法,要加到prototype中,这样相当于多个对象公用一套方法(跟java中的存储一样).

MobilePage.prototype = {
     init:function () {

     }
 }

当然,更好的写法是一个方法一个方法的写,上面这种写法会将MobilePage的prototype中已有的方法覆盖掉.

MobilePage.prototype.init = function  {

 }

或者用JQuery的extend方法进行加载

MobilePage.prototype = $.extend(MobilePage.prototype,{
     init:function () {

     }
 });

将插件的使用暴露出来.

一般一个页面只有一个分页,这时候只new一次,可以提供一个对象,自动new出来,并暴露给window.

win.MobilePage = MobilePage;
win.mobilePageUtil = {
    request:function (url,type,data,callback) {
        return new MobilePage(url,type,data,callback);
    }
}

核心方法

请求方法

类似于$.ajax等.

request:function () {
         var me = this;
         me.data.pageParams = JSON.stringify(me.pageParams);
         $.ajax({
             type:me.type,
             url: me.url,
             data:me.data,
             dataType: "json",
             success: function (result) {
                 console.info(result);
                 if (result.code == 'SUCCESS') {
                     var data = result.data;
                     if (me.callback) {
                         me.callback(data);
                     }
                     //这个data应该是一个数组,求一下length
                     me.dataLength = data.length;
                     me.dataTotal = result.total;
                 }
             }
         });
}

将$.ajax封装一下,如果成功的话,则执行回调方法。并设置自己的一些属性,包括一共有多少数据,当前返回数据有多少条,便于分页的设置。

下一页方法

nextPage:function () {
   this.pageParams.start += this.dataLength;
   //调用请求方法.
   if (this.pageParams.start < this.dataTotal) {
       this.request();
   } else {
       console.info("我已经到底线了,没有数据可加载了")
   }
},

修改start数值,判断是否加载已完成.

增加触发事件的方法

这里是用的window的scroll事件,来实现,这里有3个高度。

  1. contentH 内容的高度,也就是document的高度。
  2. viewH 屏幕的高度,也就是window的高度
  3. scrollTop 滚动的高度,当滚动到最底下的时候,理论上 contentH == viewH + scrollTop


    image.png

所以现在用 contentH == viewH + scrollTop 来判断是否滑到了最底部,假如滑到了,则触发事件,重新从服务器端请求数据.

init:function () {
         var me = this;
         //添加下拉触发的事件
         $(win).scroll(function () {
             var contentH = $(document).height();
             var viewH = $(this).height();
             var scrollTop = $(this).scrollTop();
             console.info("contentH:" + contentH);
             console.info("viewH:" + viewH);
             console.info("scrollTop:" + scrollTop);
             if (viewH + scrollTop == contentH) {
                 //拉到底了还拉.
                 console.info("已经拉到底了,你还拉");
                 //发起请求.
                 me.nextPage();
             }
         });
},

关于 var me = this;

因为this经常变换,用变量记录当时this的指向.

调用

mobilePageUtil.request({
      url: api_host + "/question/mobile/study",
      type: 'GET',
      data: {questionType: 'CHOICE'},
      callback: makeAddtionHtmls
});

由于在插件中已经将mobilePageUtil 通过 window.mobilePageUtil 暴露给了window,所以这里可以直接使用
makeAddtionHtmls为具体的方法,注意可以接受一个list的参数.

function makeAddtionHtmls(questionList) {
  console.info(questionList);
}

全部代码展示

上面介绍的是思路,代码稍有冲突,代码以下面的为准.

/**
 * 手机端分页,上拉加载,用scroll事件,嵌入到App中去.
 * @author liuzhenning
 * @version 0.0.1
 * @since 0.0.1 2019/02/27
 */

//封装成一个分页插件,自己写,将自己的代码隔离开
(function (win,document,$) {
  /***
   * 插件名,首字母大写,可以向对待类一样对待,如:new MobilePage()
   * @param url 要请求的地址
   * @param type get,post,put等
   * @param data 要传输的数据.
   * @param callcack success后要执行的函数.
   */
  var MobilePage = function (options) {
      // var MobilePage = function (url,type,data,callcack) {
      //仿照$.ajax的模式,传输对象,便于维护,方便增加属性
      this.url = options.url;
      this.type = options.type;
      this.data = options.data;
      this.callback = options.callback;
      this.pageParams = {
          start:0,
          length:3
      };
      //当次请求的数据长度,有可能=pageParams.length ,也有可能 < pagePaarams.length(最后一页)
      this.dataLength = this.pageParams.length;
      this.dataTotal;//记录一下数据的总长度
      //初始化
      this.init();
      //调一次加载数据,首页.
      this.request();
  }

  //对插件添加方法,添加方法,要加到prototype中,这样相当于多个对象公用一套方法(跟java中的存储一样).
  MobilePage.prototype = {
      init:function () {
          var me = this;
          //添加下拉触发的事件
          $(win).scroll(function () {
              var contentH = $(document).height();
              var viewH = $(this).height();
              var scrollTop = $(this).scrollTop();
              console.info("contentH:" + contentH);
              console.info("viewH:" + viewH);
              console.info("scrollTop:" + scrollTop);
              if (viewH + scrollTop == contentH) {
                  //拉到底了还拉.
                  console.info("已经拉到底了,你还拉");
                  //发起请求.
                  me.nextPage();
              }
          });
      },
      nextPage:function () {
          this.pageParams.start += this.dataLength;
          //调用请求方法.
          if (this.pageParams.start < this.dataTotal) {
              this.request();
          } else {
              console.info("我已经到底线了,没有数据可加载了")
          }
      },
      request:function () {
          var me = this;
          me.data.pageParams = JSON.stringify(me.pageParams);
          $.ajax({
              type:me.type,
              url: me.url,
              data:me.data,
              dataType: "json",
              success: function (result) {
                  console.info(result);
                  if (result.code == 'SUCCESS') {
                      var data = result.data;
                      if (me.callback) {
                          me.callback(data);
                      }
                      //这个data应该是一个数组,求一下length
                      me.dataLength = data.length;
                      me.dataTotal = result.total;
                  }
              }
          });
      },
      reset:function () {
          this.pageParams.start = 0;
      }
  }

  //一般一个页面只有一个分页,这时候只new一次,可以提供一个对象,自动new出来,并暴露给window.
  win.MobilePage = MobilePage;
  win.mobilePageUtil = {
      //只request1次,之后的request,是靠事件触发的,也就是再request的时候,那参数直接置为默认了,无需reset.
      request:function (options) {
          return new MobilePage(options);
      }
  }
})(window,document,$);

其他

因为手机端,要考虑内存容量的问题,所以这里用jquery的话会有点大,小编这里使用的是zepto,效果一样的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351