补充一些文档里没有的。
官方案例里,就是pullrefresh_main.html和pullrefresh_sub.html这两个文件。
在pullrefresh_main.html中:
- if(mui.os.ios){
- contentWebview.evalJS("mui('#pullrefresh').pullRefresh().scrollTo(0,0,100)");
- }else{
- contentWebview.evalJS('mui.scrollTo(0, 100)');
- }
其中mui('#pullrefresh')获得了子页面中id为pullrefresh的div的对象,这段代码的目的是让让滚动条在顶部。如官方文档所言,Android是用Webview实现,iOS是用H5(div)实现。下面这个代码是针对Android使用HTML5+实现的。在iOS中,用div模拟scroll,因此scrollTo方法属于pullRefresh这个方法返回的js对象。而对于Android而言,使用的是H5+扩展,scrollTo直接就是Webkit方法。
在pushfresh_sub.html中调用了pullRefresh().pullupLoading()的,目的是为了初始化(首次加载)表格:
- if (mui.os.plus) {
- mui.plusReady(function() {
- setTimeout(function() {
- mui('#pullrefresh').pullRefresh().pullupLoading();
- }, 1000);
- });
- } else {
- mui.ready(function() {
- mui('#pullrefresh').pullRefresh().pullupLoading();
- });
- }
接下来我们分析代码是如何实现上述目的的。
首先我们来分析mui('#pullrefresh').pullRefresh()是怎么回事?
在mui.js中包含pullRefresh代码主要作用是初始化PullRefresh对象,但是针对iOS和Android是不同的,前者是js对象,后者是H5+对象。
H5版本的pullRefresh方法如下:
- $.fn.pullRefresh = function(options) {
- if (this.length === 1) {
- var self = this[0];
- var pullRefreshApi = null;
- options = options || {};
- var id = self.getAttribute('data-pullrefresh');
- if (!id) {
- id = ++$.uuid;
- $.data[id] = pullRefreshApi = new PullRefresh(self, options);
- self.setAttribute('data-pullrefresh', id);
- } else {
- pullRefreshApi = $.data[id];
- }
- if (options.up && options.up.auto) { //如果设置了auto,则自动上拉一次,在官方例子中,没有设置auto,因此在sub.html中主动调用了一次
- pullRefreshApi.pullupLoading();
- }
- return pullRefreshApi;
- }
- };
注意:后面的PlusPullRefresh是绑定在Webview整个dom的扩展,然后$.fn.pullRefresh对于全局有效(jquery的语法规则),因此 $container.pullrefresh就是调用的$.fn.pullRefresh
其中核心是:
1、返回了PullRefresh或PlusPullRefresh对象
2、如果up设置了auto属性为true,则自动调用up对应的上拉加载函数加载一起数据。
然后我们来看看pullRefresh如何调用的pullupLoading
我们可以看到,实际调用pullupLoading是通过pullRefreshApi的,而后者其实是pullupRefresh中创建的PullupRefresh对象的引用,该对象有个pullupLoading()方法,其将在mui.init中声明的options作为参数传到内部,new PullRefresh(self, options);。
- function($, window, document, undefined) {
- var CLASS_VISIBILITY = 'mui-visibility';
- var CLASS_HIDDEN = 'mui-hidden';
- var PullRefresh = $.Scroll.extend($.extend({
- handleEvent: function(e) {
- this._super(e);
- ........
- pullupLoading: function(callback, x, time) {
- x = x || 0;
- this.scrollTo(x, this.maxScrollY, time, this.options.bounceEasing);
- if (this.loading) {
- return;
- }
- this._initPullupRefresh();
- this._setCaption(this.options.up.contentrefresh);
- this.indicators.map(function(indicator) {
- indicator.fade(0);
- });
- this.loading = true;
- callback = callback || this.options.up.callback;
- callback && callback.call(this);
- },
从callback= callback || this.options.up.callback;可以看出pullupLoading方法中调用了up.callback,callback.call(this)。换言之,mui('#pullrefresh').pullRefresh().pullupLoading();等于是调用了 pullupRefresh //上拉加载具体业务实现 方法。
那为什么this.options.up.callback对应的就是pullupFresh呢?
那么pullupLoading是如何调用up对应pullupRefresh自定义方法的?
简而言之,是因为在初始化时,将pullupRefresh方法赋值给了up的callback方法。如下代码所示。
- mui.init({
- pullRefresh: {
- container: '#pullrefresh',
- down: {
- callback: pulldownRefresh //下拉刷新具体业务实现
- },
- up: {
- contentrefresh: '正在加载...',
- callback: pullupRefresh //上拉加载具体业务实现
- }
- }
- });
那么这个mui.init调用的pullRefresh具体代码是如何进行参数传递的呢?
- **
- * mui.init pulldownRefresh
- * @param {type} $
- * @returns {undefined}
- */
- (function($) {
- $.registerInit({
- name: 'pullrefresh',
- index: 1000,
- handle: function() {
- <span style="color: #ff0000;">var options = $.options;</span>
- var pullRefreshOptions = options.pullRefresh || {};
- var hasPulldown = pullRefreshOptions.down && pullRefreshOptions.down.hasOwnProperty('callback');
- var hasPullup = pullRefreshOptions.up && pullRefreshOptions.up.hasOwnProperty('callback');
- if (hasPulldown || hasPullup) {
- var container = pullRefreshOptions.container;
- if (container) {
- var $container = $(container);
- if ($container.length === 1) {
- if ($.os.plus && $.os.android) { //android 5+
- $.plusReady(function() {
- var webview = plus.webview.currentWebview();
- if (hasPullup) {
- //当前页面初始化pullup
- var upOptions = {};
- upOptions.up = pullRefreshOptions.up;
- upOptions.webviewId = webview.id || webview.getURL();
- $container.pullRefresh(upOptions);
- }
- if (hasPulldown) {
- var parent = webview.parent();
- var id = webview.id || webview.getURL();
- if (parent) {
- if (!hasPullup) { //如果没有上拉加载,需要手动初始化一个默认的pullRefresh,以便当前页面容器可以调用endPulldownToRefresh等方法
- $container.pullRefresh({
- webviewId: id
- });
- }
- var downOptions = {
- webviewId: id
- };
- downOptions.down = $.extend({}, pullRefreshOptions.down);
- downOptions.down.callback = '_CALLBACK';
- //父页面初始化pulldown
- parent.evalJS("mui&&mui(document.querySelector('.mui-content')).pullRefresh('" + JSON.stringify(downOptions) + "')");
- }
- }
- });
- } else {
- $container.pullRefresh(pullRefreshOptions);
- }
- }
- }
- }
- }
- });
- })(mui);
- /**
其中$container是从mui.init中的pullRefresh初始化的参数中来的:
- var container = pullRefreshOptions.container;
就是containers等于id为pullreresh的那个div。
这段代码的核心是:
1、 通过调用$container.pullRefresh(pullRefreshOptions);, 将sub.html中配置的container,up,down这些options都传给了PullRefresh对象。
2、也是通过上述代码,初始化了PullRefresh对象。
总结:
1、在mui.init中通过调用pullRefresh将container,up,down等参数传入初始化了PullRefresh对象(针对iOS使用H5),或PlusPullRefresh对象(针对Android使用HTML5+)
2、在mui('#pullrefresh').pullRefresh().pullupLoading();中完成了表格初始化加载。调用了up对应的pullupRefresh方法。
3、当下拉刷新时,调用down对应的方法pulldownRefresh;当上拉加载时,调用up调用的方法pullupRefresh;
4、在pullupRefresh和pullupRefresh中利用ajax实现远程数据加载。
5、在mui.init中初始化pullRefresh时,可以通过参数来设置显示的话术,不写的话默认也有话术,见源代码。
- up:{contentrefresh:"正在加载...",//可选,正在加载状态时,上拉加载控件上显示的标题内容
- contentnomore:'没有更多数据了',//可选,请求完毕若没有更多数据时显示的提醒内容;
==================================================================================================================
var count = 0; /** * 上拉加载具体业务实现 */ function pullupRefresh() { setTimeout(function() { mui('#pullrefresh').pullRefresh().endPullupToRefresh((++count > 2)); //参数为true代表没有更多数据了。 var table = document.body.querySelector('.mui-table-view'); var cells = document.body.querySelectorAll('.mui-table-view-cell'); for (var i = cells.length, len = i + 20; i < len; i++) { var li = document.createElement('li'); li.className = 'mui-table-view-cell'; li.innerHTML = '<a class="mui-navigate-right">Item ' + (i + 1) + '</a>'; table.appendChild(li); } }, 1500); }
下面分析一下上拉加载的代码,同时它也是表格初始化的代码。
mui('#pullrefresh').pullRefresh().endPullupToRefresh((++count > 2)); //参数为true代表没有更多数据了。
这句代码用于显示没有更多数据这句话,并结束上拉。由于官方案例主要用于模拟,因此它的终止条件是上拉2次,但是初始化表格还算一次,因此count最终等于3而终止上拉。
如果是真实项目,应该是先用Ajax从远程或storage从本地加载数据,应该从Server返回一个属性标识是否后续还有数据。
同时还需要考虑首次加载和上拉加载的参数传递。
假设列表是按照item的id排序(假设id是自增序列),首次加载从max(item_id)返回20条数据,这样上拉加载时就告知server当前列表底部最后一条数据的id,然后server返回比该id更小的20条数据。当下拉刷新时,向服务器请求id大于列表顶端的item。
rest api:上拉加载 1、/list/load 加载最新的20条,select * from list orderby id limit 20
2、/list/load?startId={列表底部item的id} select * from list where id<{列表底部item的id} limit 20
如果返回的结果小于20,那说明已经到底儿了,返回给客户端告知isEnd:ture
下拉刷新 :/list/load?endId={列表顶部item的id} select * from list where id>{列表顶部item的id} orderby id limit 20
如果新的数据大于20,也不可能一次都拉过来,上述sql返回离现在最近的20条,余下的可以采用循环拉取方式,比如发现select回来加了limi限制的数据和select count(*) from list where id>{列表顶部item的id} 相比更少,可以再次发起请求拉取,/list/load?endId={本次下拉刷新操作前列表顶部item的id} & startId={上次取回的数据最小的id}, select * from list where id>{本次下拉刷新操作前列表顶部item的id} and id<{上次取回的数据最小的id} orderby id limit 2,然后拿回来的数据再次与select count(*) from list where id>{本次下拉刷新操作前列表顶部item的id} and id<{上次取回的数据最小的id}比如果还是小,那么告知客户端继续拉取。
另一种方式是将之前的数据清掉,保证可以触发上拉加载事件(不知道MUI是否支持)
其实如果量不大,就一次性都拉过来也可以,也就是去掉limit 20的限制。
返回的结果集json:
var result={"list":[
{"item_id":1,"item_content":"Hello cat"}, {"item_id":2,"item_content":"Hello dog"}
],"isEnd":true}
相关推荐
**MUI选项卡下拉刷新上拉加载Demo详解** 在移动应用开发中,为了提供流畅且高效的用户体验,上拉刷新和下拉加载已经成为必不可少的功能。MUI(Mobile UI)是DCloud公司推出的一款轻量级的前端框架,专门用于构建高...
【uniapp新闻列表-上拉刷新-下拉加载更多】是一个基于uniapp框架开发的应用功能模块,主要用于构建具有动态加载和刷新功能的新闻列表。uniapp是一个多端开发框架,它允许开发者用一种语言(Vue.js)编写代码,然后...
`down.callback`用于定义下拉刷新的回调函数,`up.callback`则用于上拉加载的回调函数。 3. **回调函数实现**:`pulldownRefresh()`和`pullupRefresh()`是两个关键的回调函数。`pulldownRefresh()`通常用来模拟数据...
本文将详细讲解如何使用MUI进行APP混合开发,实现下拉刷新和上拉加载这两个常用功能。 首先,我们需要确保开发环境已搭建完成,这里使用的是HBuilder,一个集成开发环境,支持通过MUI快速构建Android和iOS的APP。...
mui框架基于htm5plus的XMLHttpRequest,封装了常用的Ajax函数,支持GET、POST请求方式,支持返回json、xml、html、text、script数据类型; 本着极简的设计原则,mui...那么如何实现下拉刷新,上拉加载的功能呢? 首先
在移动应用开发中,下拉刷新(Pull-to-Refresh)和上拉加载更多(Infinite Scroll)是提高用户体验的关键功能,特别是在浏览列表或内容流时。MUI(DCloud 的 Mobile UI)是一个轻量级的前端框架,它提供了一套方便的...
它的核心组件库包括导航栏、侧滑菜单、下拉刷新、上拉加载等,这些组件在实际应用中极为常见。此外,MUI还提供了丰富的样式和主题定制,使得开发者可以轻松打造出符合自身品牌风格的界面。 2. **导航栏...
1. **MUI滚动事件监听**:MUI提供了一个名为`pullRefresh`的插件,用于实现下拉刷新和上拉加载更多。开发者需要在页面初始化时绑定这个插件,并设置相应的参数,如容器ID、加载提示文本等。 2. **CSS样式调整**:...
今日头条APP案例开发文档主要讲解了基于H5+的APP开发的各种技术要点,包括H5+ Runtime的介绍、Mui和Hui框架的使用、项目部署、制作子窗口、数据加载、下拉刷新、新闻分类切换、上拉加载更多、懒加载、新闻详情页面...
下拉加载通常用于在用户滚动到底部时加载更多内容,而上拉刷新则是在用户上拉屏幕时更新数据。MUI框架内置了这两项功能的实现,通过简单的配置和调用,开发者可以轻松地集成到自己的应用中。 ### 3. MUI组件应用 ...
例如,下拉刷新和上拉加载组件可以轻松实现列表的动态加载,而导航栏则能够确保用户在不同页面间流畅切换,提供良好的用户体验。 MUI还提供了强大的样式定制能力,允许开发者根据自身需求调整主题颜色、字体大小等...
4. **便捷的API接口**:MUI提供了简单易用的API,让开发者可以快速实现常见的交互功能,如滑动、下拉刷新、上拉加载等。 在这个"MUI学习例子系列2"中,你将看到一个实际的App应用案例,它可能包含了以下部分: - *...
2. 下拉刷新和上拉加载:这两个插件解决了移动应用常见的数据刷新和加载问题,提供了流畅的用户体验。 3. 弹出层:MUI 包含了对话框、提示、加载提示等多种弹出层组件,方便在不同场景下使用。 4. 动画效果:MUI ...
1. **高度仿原生**:MUI的设计理念就是尽可能地模仿原生应用的界面和交互,包括滑动效果、下拉刷新、上拉加载等,使用户在使用H5应用时几乎感觉不到与原生应用的区别。 2. **高性能**:MUI采用了一种名为"FastClick...
MUI的核心组件包括但不限于:下拉刷新、上拉加载、侧滑删除、抽屉导航、选项卡、轮播图、时间选择器等。这些组件都基于原生的HTML、CSS和JavaScript编写,通过优化的DOM操作和事件处理,实现了流畅的动画效果和高效...
3. **初始化设置**:在JavaScript中调用`$.mui.init()`进行全局初始化,这一步会自动处理页面的下拉刷新、上拉加载等功能。 4. **使用组件**:根据需要选择并使用MUI提供的组件,例如,创建一个按钮只需添加特定的...
MUI框架的核心组件在模板中得到广泛应用,如轮播图组件用于商品展示,下拉刷新和上拉加载更多用于列表滚动加载,侧滑菜单提供导航功能,表单组件则用于用户输入信息等。这些组件都经过优化,加载速度快,运行流畅,...
为了不影响下拉刷新和上滑加载,开发者可能会在组件中加入特定的事件监听和处理逻辑。例如,当检测到下拉动作时,可以通过阻止默认的滚动行为,确保页面的正常下拉刷新;同样,对于上滑加载,也需要避免按钮与滚动...
- 商品列表:演示如何动态加载商品数据,实现下拉刷新、上拉加载更多等功能。 - 侧滑菜单:展示如何实现类似原生App的侧滑菜单,提供多层级的导航。 - 滑动切换卡片:通过手势识别,实现卡片间的滑动切换效果,常见...