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

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

要回复文章请先登录注册

你真美

你真美

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

44596296

回复 1***@qq.com :
你好,你的这个问题解决了吗
2017-12-21 11:24
1***@qq.com

1***@qq.com

回复 Alert_Hello :
你好,请问你是怎么解决的,为什么我的还是没效果,有demo吗
2017-11-18 17:39
Ricky_Cslg

Ricky_Cslg

回复 DCloud_UNI_FXY :
您好,可拖拽选项卡的那个demo,如果选项卡是动态生成的,那么动态生成的选项卡就无法下拉刷新了。这个问题怎么弄呢? 是否需要重新初始化?求解答。谢谢
2017-09-02 17:37
z***@163.com

z***@163.com

回复 采集 :
顶一个 谢谢你解决了我的问题 不过我要补充的是 前面要有 mui.init(); 这样的写法 就算页面有一百个需要用的上拉刷新的功能也不怕了 感谢
2017-05-09 15:18
2***@qq.com

2***@qq.com

回复 Alert_Hello :
能给个demo吗?看了好乱
2017-04-18 16:39
Alert_Hello

Alert_Hello

用楼主的方法可行!有效!
2017-03-31 10:32
Tomkit

Tomkit

回复 采集 :
人才啊
2017-03-10 17:59
Tomkit

Tomkit

回复 采集 :
可以执行,两个pullrefresh么
2017-03-10 17:55
浮沈

浮沈

确实存在这样的bug
2016-11-10 16:43