szaos
szaos
  • 发布:2016-02-05 12:06
  • 更新:2016-02-15 14:38
  • 阅读:2891

preload是否会引起 预加载的页面的 后续页面也加载?

分类:HTML5+

比如有 A->B->C->D->E页面
打开app进入A页面,在A页面preload B页面

B页面 直接 js 再 preload C,

C 在plusReady 里 preload D,

D 在 plusReady 里 init E,JS 监听 tap事件 展示E

那么我在A页面的时候 内存中 是否有 B\C\D\E? 或者已经有其中哪些?

2016-02-05 12:06 负责人:无 分享
已邀请:
maq

maq

@DCloud_MUI_FXY:

我想了一下,可能从 H5+ Specification 的角度来说,webview 少了一个 onshow 事件,如果有这个事件的话,webview B 中 preload 的 webview C 何时被真正创建的问题,就可以由 webview B 自己来控制了,而不必由它的 opener(webview A)来帮忙。

  • szaos (作者)

    是的,we need onshow

    2016-05-12 17:40

szaos

szaos (作者)

补充:
主要希望了解,

1.页面展示的时候其preload的页面 中还有 preload页面,是否会继续加载下去。
比如一个app中有20个页面都是有preload,那是不是进入第一个页面就会preload剩下的所有20个页面?

2。比如M页面中 preload N页面,但N页面有 2个子页面。
那么在M preload N的时候,是否会一起 preload N的子页面?

DCloud_UNI_FXY

DCloud_UNI_FXY

不会同时预加载,
A->B->C->D->E
A显示,则预加载B,B显示则预加载C,以此类推
目前仅init中的preloadPages配置项是以上述逻辑执行,其他方式预加载不支持。

  • szaos (作者)

    那么 A显示 预加载B,B的sub级的view加载吗?

    2016-02-05 16:15

  • DCloud_UNI_FXY

    回复 szaos:你是说init里边的subpage?subpage会加载

    2016-02-05 16:24

  • szaos (作者)

    谢谢,继续追问。

    预加载的页面 B 有如下js

    (function($, doc) {

    $.plusReady(function() {

    // 获取传值

    alert(1)

    })

    }(mui, document));


    这样A->B 在A中预加载 B 的时候就会 alert1,

    那么我在 alert这个位置 preload C,是不是也就 预加载C了。这个预加载C应该写在哪里?


    有没有 类似 B页面 onShow的 回掉函数?

    2016-02-05 17:40

  • szaos (作者)

    或者 有没有 类似IOS 生命周期的 相关函数。A中写代码预加载B,那么B中是不是有一个函数专门等待到 B展示出来的时候被回调?

    2016-02-05 17:43

maq

maq

@DCloud_MUI_FXY:

我做了一个测试程序,结果跟你所说不太一样。

我测试的结果是:A 作为启动页,通过 preloadPages 指定的 B 被创建了,C 的确没有被创建,但问题是,当 B.show() 之后,C 仍然没有被创建。当第二次点击 show 按钮的时候,程序报错了,没有找到指定的 webview。

是我的用法有什么不对的地方吗?

测试代码 preload-index.html 如下:

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8">  
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />  
<script src="js/mui.js"></script>  
<script type="text/javascript">  
var preload_id = 'v_' + Date.now() + '_' + Math.floor(Math.random() * 10000);  
console.log('preload_id: ' + preload_id);  
mui.init({  
    preloadPages:[{  
        url: 'preload-index.html',  
        id: preload_id  
    }]  
});  
mui.plusReady(function() {  
    mui('#btn-show')[0].addEventListener('tap', function() {  
        console.log('show: ' + preload_id);  
        var v = plus.webview.getWebviewById(preload_id);  
        v.show();  
    });  
    document.title = plus.webview.currentWebview().id;  
    mui('#my-id')[0].innerText = plus.webview.currentWebview().id;  
    mui('#preload-id')[0].innerText = preload_id;  
});  
</script>  
</head>  
<body>  
<button id="btn-show">show</button>  
<div>  
    me: <span id="my-id">-</span>  
</div>  
<div>  
    preload: <span id="preload-id">-</span>  
</div>
szaos

szaos (作者)

好凌乱。。。。

DCloud_UNI_FXY

DCloud_UNI_FXY

必须通过mui.openWindow来show,不能直接用plus的webview的show,因为该机制是mui内部封装的。不是plus实现的

水逸

水逸 -

太乱了 ,其实很简单 预加载:就是页面显示与隐藏

流程就是创建一个页面,让其隐藏起来,你让他显示的时候 你再让他显示,只不过mui.openwindown只是打开显示页面的一种方式,当然里面包括官网所认为的仿原生的动画。

ps:
为什么几年了,一直不解决最关键问题:1.滚动条滑动的速度、2.打开页面的动画控制。

敢问能否做好200毫秒内 前100毫秒打开页面的百分比 后100毫秒打开页面的百分比

  • maq

    你说的当然没错,不过本贴要讨论的要点是:每个 webview 都有自己需要预加载的“下一个 webview”,如何做到当第一个 webview 打开后不要一口气把所有的 webview 都预加载到内存里面来。

    2016-02-15 14:22

maq

maq

@DCloud_MUI_FXY:

试了一下,果然如此,谢谢!

不过有一点小遗憾,对于已经预加载的 webview 调用 mui.openWindow() 的时候,url 参数显然就没什么用处了,于是下面这种写法显得有一点怪异:

mui.openWindow('', preload_id);

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