然后去远足
然后去远足
  • 发布:2016-03-07 21:06
  • 更新:2019-05-08 10:48
  • 阅读:28079

解决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

要回复文章请先登录注册

1***@qq.com

1***@qq.com

他上拉显示更多文字不居中是怎么回事,就第一次,不居中 后面就好了
2019-05-08 10:48
XIAOSHEN666

XIAOSHEN666

回复 Ricky_Cslg :
你的问题解决了吗?我现在遇到同样的问题,求解答
2018-12-20 15:39
itxiaoxiao

itxiaoxiao

用这个低端机加载数据能卡的你怀疑人生
2018-09-04 10:39
2***@qq.com

2***@qq.com

回复 雪梨 :
完美
2018-08-28 15:22
雪梨

雪梨

不用mui.init去初始话,
//只有一次调用
/*mui.init({
pullRefresh: {
container: '#pullrefresh',
down: {
callback: pulldownRefresh
},
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
}
}
});*/
//可多次调用
mui("#pullrefresh").pullRefresh({
up: {
contentrefresh: '正在加载...',
callback: pullupRefresh
},
})
2018-07-20 14:28
喂謀謀

喂謀謀

就不能给一个demo吗?
2018-07-16 10:16
1***@qq.com

1***@qq.com

回复 你真美 :
微博怎么有无法打开了啊
2018-02-23 15:15
1***@qq.com

1***@qq.com

回复 采集 :
能否给个demo
2018-01-30 16:58
1***@qq.com

1***@qq.com

回复 你真美 :
通过你的方法改了之后,是可以了,但是每次刷新以后的内容都填充到了第一个子页面中,这个页面解决啊,最好有个demo
2018-01-30 16:27
你真美

你真美

这个问题我已经解决了,我把它发表在微博里面的 https://weibo.com/ttarticle/p/show?id=2309404199356277365017
2018-01-23 14:19