然后去远足
然后去远足
  • 发布:2016-03-07 21:06
  • 更新:2024-10-21 18:51
  • 阅读:28752

解决MUI同一个页面不能初始化多个下拉/上拉刷新的问题(非父子Webview方式)

分类:MUI

【背景介绍】
  MUI 版本 2.8。
  在页面中使用了 TabBar 组件(mui-bar-tab),每个子面板都有上拉加载和下拉刷新。

【问题阐述】
  由于项目需要,每个子页面之间需要有数据进行同步。
  如果采用父子 Webview 的方式去加载子页面,确实可以做到每个子面板各自拥有独立的下拉刷新功能,但跨 Webview 的数据同步非常蛋疼:传值还好说一点儿,可以使用 evalJs;取值就更麻烦了,需要使用 localStorage 之类的中间存储做中转(当然也可能是本人才疏学浅,没有摸索到更牛叉的方式)。而且跨 Webview 操作 DOM 十分的不便。
  如果使用 Div 方式实现父子面板,再辅以 Avalon、Angular 之类的 MV* 方案,数据同步问题可以很好的解决。但是,却在下拉刷新功能上出现的了问题。当使用官方的 mui.pullToRefresh.js,调用 mui(scroller).pullToRefresh() 初始化多个下拉刷新组件时,竟然只有第一个起作用。如果同时引入了 mui.pullToRefresh.material.js 文件,还会抛一个空指针异常。
  我转而想到是否可以多个子面板共用一个下拉刷新,然后通过判断当前激活的是哪个面板的办法来选择执行何种操作。但经过尝试后发现,这样做存在两个问题:1、每个子面板的下拉刷新事件不能独立,即在面板A执行下拉操作时,如果下拉刷新未结束,跳转到面板B时是无法刷新B的;2、使用同一个 mui-scroll-wrapper 定位不能独立,在面板A时滚动条在某个坐标位置,切换到B时也会是在这个坐标,体验很差。

【解决方案】
  遇到问题首先上论坛搜集资料,发现还是有很多人遇到了和我同样的问题的,比较有代表性的是 http://ask.dcloud.net.cn/question/1970 这篇贴子。但官方给出的答案和我自己想的共用一个下拉刷新如出一辙,这样就会遇到我的那两个问题。
  难道就这么放弃 Div 方式,转而使用 Webview 这么蛋疼的方式吗?
  正当我苦恼之时,突然灵光一闪,mui-scroll-wrapper 都可以在同一个页面中初始化多次,而 pullToRefresh 是在 mui-scroll-wrapper 的 $.fn.Scroll 基础之上做的扩展,没道理不能初始化多次啊?
  于是我仔细查看了 mui.pullToRefresh.js 的源代码(顺便吐个槽,贵司的开发人员写代码时不屑于写注释么……看的这个头大……),发现第 101 行存在代码

 var element = document.querySelector('.' + CLASS_PULL_TOP_TIPS);

第 194 行存在代码

if (document.querySelector('.' + CLASS_PULL_TOP_TIPS)) {

  结合上下文来看是为了判断当前页面是否存在下拉刷新标志的,但居然是从整个文档中检索,而非对应的 mui-scroll-wrapper 内检索,怀疑此处有问题。遂将 document 改为 this.element,保存,执行。
  至此,问题解决。

7 关注 分享
Alert_Hello 云流音 罗罗诺亚索隆 Trust q***@163.com 5个萝卜 4***@qq.com

要回复文章请先登录注册

采集

采集

上面传入的值错误 激动了
mui('#personalOrdersRefreshContainer').pullRefresh({
container: '#personalOrdersRefreshContainer',
down: {
auto: true,
callback: personalOrdersPulldownRefresh
},
up: {
callback: personalOrdersPullupRefresh
}
});
2016-10-28 18:04
采集

采集

我在写单页模式下,子页都是窗口div加载进来时,也遇到这个问题。
我最终解决办法:在需要加载的新页面,执行pullRefresh
mui('#personalOrdersRefreshContainer').pullRefresh({
pullRefresh: {
container: '#personalOrdersRefreshContainer',
down: {
auto: true,
callback: personalOrdersPulldownRefresh
},
up: {
callback: personalOrdersPullupRefresh
}
}
});
2016-10-28 18:01
8***@qq.com

8***@qq.com

楼主能不能弄个你这个问题的demo,我遇到了和你一样的问题
2016-10-12 21:23
2***@qq.com

2***@qq.com

高手,求教,我现在用tab bar DIV 模式 底部模版,1个页面进行滚动,其他3个页面也跟着滚动(虽然看不见)。。。。怎么让每个DIV页面拥有自己的滚动
2016-08-15 18:11
x***@tops001.com

x***@tops001.com

我也遇见这样的问题,我看了帖子,但是按照方法去尝试,还是没有起作用,能附上简单的一个demo吗?
2016-06-06 11:11
HGDQ

HGDQ

[《HTML5 WebApp开发(二)表格上拉加载更多下拉刷新》](http://blog.csdn.net/zhuming3834/article/details/51485074)
2016-05-24 22:19
回到过去

回到过去

回复 DCloud_UNI_FXY :
我现在的程序里,在顶部tab加入下拉刷新后,发现向上拖动不好用了,是什么情况?
2016-03-15 10:12
DCloud_UNI_FXY

DCloud_UNI_FXY

可以这么理解,是多个下拉刷新实例,但是同一个tips,所以同一时间只能有一个下拉刷新在工作,你的业务需要同个下拉刷新操作同时并存?如果是,可以像你那样改一下代码。当时tips做成全局的,是考虑到下拉刷新操作一般同一时间只会存在一个。否则就会看到多个下拉刷新的提示动画。
2016-03-07 21:47
然后去远足

然后去远足 (作者)

回复 DCloud_UNI_FXY :
感谢您的回复。您是说 examples/pullrefresh_with_tab.html 这个例子吧?我看过这个例子,跟我想要的效果还是不一样的,这个例子里还是全局共用了一个下拉刷新,每个面板只是下拉后的回调独立了,但下拉操作本身不独立。当面板A在刷新的时候,切换到面板B时是无法对面板B进行下拉操作的。不知道我这样理解的对不对。
2016-03-07 21:41
DCloud_UNI_FXY

DCloud_UNI_FXY

你用的下拉刷新是哪个?可拖拽选项卡的那个下拉刷新demo本身就是支持多个tab的下拉刷新的。
你修改的那段代码是在mui.pullToRefresh.js里边吧。这个本身就是全局唯一的。不同tab的下拉刷新共用一个top tips。
2016-03-07 21:35