DCloud_UNI_CHB
DCloud_UNI_CHB
  • 发布:2014-11-24 22:02
  • 更新:2021-04-01 09:20
  • 阅读:86606

hello mui中的无等待窗体切换是如何实现的

分类:MUI

从mui v0.7.0版本开始,hello mui示例App的窗体切换性能大幅提升,点击一个链接,不显示雪花等待框,立即打开一个“正在加载...”的页面,之后真实内容快速填充“正在加载...”区域;本文详细讲解如何实现这种窗体切换效果。
整体思路:
1、预加载一个模板父页面(template.html)和共用子页面;
2、点击列表链接时,直接显示模板父页面,并动态修改模板父页面的标题;
3、共用子页面通过loadURL方法加载对应目标页面;

步骤分解:
list.html页面中预加载模板父页面和共用子页面,为了提高效率,共用子页面默认加载了主列表中的第一项(accordion.html),代码如下:

//预加载模板父页面  
var template = mui.preload({  
    url:'examples/template.html',  
    id:'demoTemplate',  
    styles:{  
        popGesture:"hide"  
    }  
});  
//预加载共用子页面  
var subWebview = mui.preload({  
    url:'examples/accordion.html',  
    id:'template_sub',  
    styles:{  
        top: '48px',  
        bottom: '0px'  
    }  
});

点击列表项时,立即显示模板父页面,改变模板父页面标题,共用子页面加载对应的目标页面,代码如下:

var title = this.innerText;  
template.evalJS("with(document.getElementById('title')){innerHTML='" + title + "';className='mui-title mui-fadein';};");  
if(subWebview.getURL()==this.href){  
    subWebview.show();  
}else{  
    subWebview.loadURL(this.href);  
}  
template.show('slide-in-right', 150);

共用子页面默认隐藏,等加载新内容完毕后,再显示出来,代码如下:

subWebview.addEventListener('loaded', function() {  
    setTimeout(function(){  
        subWebview.show();    
    },50);  
});

新页面按下返回按钮后,隐藏模板父页面,并在窗体动画结束后,隐藏共用子页面,代码(App.js)如下:

getTemplateWebview().hide('auto');  
setTimeout(function() {  
    document.getElementById("title").className = 'mui-title mui-fadeout';  
    getSubWebview().hide("none");  
}, 200);

如上方案的优点:
1、模板父页面预加载,点击后立即显示,不用展示雪花等待框,也不会出现白屏现象;
2、共用子页面,有效控制webview数量,避免切页时频繁创建、销毁webview;

52 关注 分享
半杯可乐 潘歌 感受呼吸 saint宝宝 达达x 小帆 仙人指路 leolong 老张放羊 一瓢哥会狮吼功 efeiwork 随风如下 asdfasdf23r blj 好冷 老万 jijinduoduo Back 言和 猫的哈 wenxy Mrlcq 341348 xiamo152 wenju johnson_liu BobLau 水域心诚 RyanHooper Trust 2***@qq.com w***@163.com 雪之梦技术驿站 gaohuazi 小新的狗叫小白 7***@qq.com e***@126.com abiu 1***@qq.com j***@163.com MR不靠谱 gitfengyuzhang 最光阴 那年暑假 fx4399 bonly 1***@qq.com 9***@qq.com 风刀霜剑 2***@qq.com

要回复文章请先登录注册

DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 Danny :
这种场景不建议使用模板方案;
2015-05-20 14:29
Danny

Danny

速度快了很多,但是有个问题,页面A -> B -> C,点击返回时,怎么处理可以从C -> B -> A顺序返回呢?
2015-05-16 20:47
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 仙人指路 :
(function($){
//这里$是外面mui的替代,可直接使用$
})(mui)
2015-04-27 13:40
仙人指路

仙人指路

回复 豆豆xiao宽 :
我也很奇怪,不是mui.的吗?$.也能代替mui.?
2015-04-27 08:42
豆豆xiao宽

豆豆xiao宽

为什么是$符号 ?
2015-02-09 11:27
潘歌

潘歌

回复 gortonlau :
关于解决输入法的问题有没有临时的解决方案那?

看到类似的情况的解决思路是这样的:
1、点击回复或发表按钮,然后将输入框的位置移动到顶部;
2、再点击输入框,只要控制好输入框的高度,输入法就不会被挡住了。
2014-12-31 19:45
潘歌

潘歌

关注该思路解决加载速度和减少创建页面的问题~哦
2014-12-24 20:03
gortonlau

gortonlau

回复 DCloud_UNI_CHB :
嗯,还是要解决掉输入法遮挡问题的好。有没有临时的解决方案那?这样点击进入input 页面 明显感觉相对loadURL来说要有一点卡顿的感觉。再有就是Webview的 Loaded 等价于 DOMContentLoaded吗?如果等价的话,那么按照常规来说,因为样式表会阻止JS的执行,页面可能要等到样式表加载完毕以及JS执行完毕以后才会触发这个事件。还是说,因为Webview是不可见的,所以只是会构建DOM树以及Render树,然后当Webview 显示的时候,才根据Render进行渲染,在此之前并不进行任何渲染,所以才确定要setTimeout处理下。我现在的理解就是loaded 等价于DOMContentLoaded,可是不是太确定渲染是在loaded之前就发生还是在此之后。测试在chrome浏览器中,浏览器是一边解析一边渲染的。如果webview也是这样的话,那么极有可能渲染在loaded之前就有发生。还是说在这里的话,loaded就只是单纯的dom树构建完成,下一步才开始根据render进行渲染。
2014-11-24 23:37
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

@kwork 你的分析很对,现在双webview下确实存在输入法遮挡的问题,所以hello mui中对Input页面没有使用模板机制;setTimeout的猜测也是对的,有可能loaded事件发生后,绘制尚未完成,立即显示的话,用户可能会看到从左到右、从上到下的分块绘制过程。
2014-11-24 22:23
gortonlau

gortonlau

这样存在的问题是,通过LoadUrl载入的页面,页面中的输入框会被输入法挡住,而新创建webview,没有这样的问题。还有就是show的时候为什么要用setTimeout,是因为loaded等于 DOMContentLoaded,这个时候其实还没进行渲染,只是DOM树构建完毕。所以才要进行延时显示吗?
2014-11-24 22:18