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

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

要回复文章请先登录注册

2***@qq.com

2***@qq.com

@然后去远足 你好看了你的文案后是解决了使用两个下拉刷新的问题但是我的页面无法上下滑动了是什么原因
2024-10-21 18:51
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