Eason
Eason
  • 发布:2016-03-02 14:27
  • 更新:2016-03-03 03:52
  • 阅读:2929

预加载页面问题汇总

分类:MUI
mui

问题:
1、使用mui.init的preloadPages预加载页面后。无论是通过mui.openWindow还是mui.fire通知被预加载的webview自己打开自己,都会出现打开页面白屏的情况。
2、改用mui.preload逐条加载,封到函数中并在首页执行。当数量超过10条时,会出现“: Maximum call stack size exceeded”这个错误。无论是在mui.init()还是在mui.js中修改preloadLimit都依然会出现这个问题。

2016-03-02 14:27 负责人:无 分享
已邀请:
maq

maq

这要看代码才能分析原因。

  • Eason (作者)

    能分享一下你的预加载实现逻辑吗。1、使用方式是mui.init(),还是mui.preload。2、首页全部预加载,还是只预加载二级页面。

    2016-03-02 14:57

DCloud_UNI_FXY

DCloud_UNI_FXY

发一个可直接运行的测试工程

  • Eason (作者)

    工程已发

    2016-03-02 16:59

Eason

Eason (作者)

@DCloud_MUI_FXY

index.html设置为入口,调试问题1;
index2.html设置为入口,调试问题2

Eason

Eason (作者)

@DCloud_MUI_FXY
我现在所有的页面都是需要预加载的,打开页面都是通过“通知该页面执行ajax并渲染好页面,currentWebview.show()”。这种方式是否有问题。

index.html设置为入口,调试问题1;
index2.html设置为入口,调试问题2

maq

maq

看了你的程序,没有实际跑,我只是觉得,当你点击 way1 的时候,可能产生了三个动作,两个是因为 tap 事件,一个是链接本身。

  • Eason (作者)

    mui框架默认是屏蔽href跳转的应该

    2016-03-03 02:54

DCloud_UNI_FXY

DCloud_UNI_FXY

问题1:
你preload的a.html里边配置subpages,且是两个空对象,导致创建了两个空白webview一直在显示着,所以你的a.html看不到了。吧subpages去掉即可
问题2:
无法重现,我这里不提示错误

  • maq

    如果某行 mui.preload(...) 误写成了 preload(...),就会出那个错误了,不过我相信实际情况不会是这种低级错误,hehe

    2016-03-02 20:53

maq

maq

话说,preloadPages 里面为什么又定义了一个 subpages 呢?这个 subpages 不应该是那个被 preload 的页面自己考虑的问题吗?在这里给那个 webview 强加了一组 subpages,那个 webview 初始化的时候自己又搞一套 subpages,不是很容易乱套吗?

设计成这样,是有什么特殊的考虑吗?@DCloud_MUI_FXY

  • DCloud_UNI_FXY

    preloadPages里的单个对象配置是与createWebview,openWindow等参数的webview配置一致的,subpages的使用可以根据自己的业务需求决定在哪个地方配置

    2016-03-02 21:11

Eason

Eason (作者)

@DCloud_MUI_FXY
问题1解决了,原因和你说的一样,创建了两个空的webview。

我看到mui.js中preloadLimit设置为10。我使用的是mui的tab模版,在tab-main页面plusReady后,调用了若干个mui,preload方法。mui.preload方法预加载的页面加上tab-main页面plus.webview.create的页面数量之和超过10,就会报“Maximum call stack size exceeded”这个错误。无论是在mui.js或者是在tab-main页面的mui.init中修改prealoadLimit仍然有这个错误。而在mui.init中使用preloadPages预加载不用设置preloadLimit也不会有问题。

那么我想请问的是:
1、使用mui.preload是否有这个限制?是否需要设置preloadLimit?mui.preload源码也是调用plus.webivew.create的,那么plus.webview.create这个也应该算在预加载中?
2、为了打开页面体验良好,将所有页面都预加载,是否有问题?
2、哪种方式是否是正确的预加载实现方式呢?
方式1:tab-main.html页面通过mui.init({preloadPages:[]})预加载所有的页面
方式2:tab-main.html页面只加载一级子页面,在每层页面中都只加载自己的一级子页面。
其他,请补充

  • DCloud_UNI_FXY

    不用考虑preloadLimit

    不要将所有页面都预加载

    每层只加载自己的页面

    只把核心页面,经常使用的预加载。

    2016-03-03 18:41

Eason

Eason (作者)

@DCloud_MUI_FXY
正常的预加载方式,如果预加载页面的数量超过10个。
mui.init方式和mui.preload方式分别应该怎么处理呢?

  • DCloud_UNI_FXY

    数量怎么那么多,全都需要在一个地方初始化?你可以分散到这些页面的前一个页面分别初始化

    2016-03-03 15:00

  • Eason (作者)

    回复 DCloud_UNI_FXY:我页面都使用mui.fire方式通知子页面执行ajax渲染成功后显示出自己。如果在预加载的页面不使用mui.openWindow打开就无法触发级联的预加载。而使用mui.openWindow因页面是预加载的又无法传参。

    2016-03-03 15:57

  • DCloud_UNI_FXY

    回复 Eason:mui.openWindow后,紧接着fire通知呢。

    2016-03-03 16:01

  • Eason (作者)

    回复 DCloud_UNI_FXY:这个我试过,没问题的。但是你没觉得这样写代码不太好么。。另外麻烦回复下我楼上的问题。使用mui.preload和mui.init({preloadPages})是否会有数量的限制,有的话如何正确设置preloadLimit呢

    2016-03-03 16:19

Eason

Eason (作者)

http://ask.dcloud.net.cn/question/328
预加载页面中,再预加载页面无法成功。
一定要使用mui.openWindow才能触发子页面的mui.init预加载吗,是否有其他方式

  • DCloud_UNI_FXY

    目前只能通过mui.openWindow触发级联的预加载

    2016-03-03 15:01

该问题目前已经被锁定, 无法添加新回复