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

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

要回复文章请先登录注册

上交国家

上交国家

这种方式下,如果列表页有下拉刷新,打开不带下拉刷新的详细页,还是会出现下拉刷新的功能,这个怎么破?
2015-11-02 13:37
好冷

好冷

哦,群里说这样用模板方式切换好些,马克下
2015-09-21 00:18
blj

blj

在吗?我请你指教如上代码,我看了再看,真的不太懂得,能用QQ联系你吗?感谢感谢
2015-09-14 21:44
efeiwork

efeiwork

我这样写:
document.getElementById("backto").addEventListener('tap',function(){
var subweb = plus.webview.getWebviewById('template_sub');
var temp = plus.webview.getWebviewById('demoTemplate');
subweb.hide('none');
temp.hide('slide-out-right');
})
网络地址不是加载进来父窗口了吗?父窗口我监控到点击退出了。子窗口也隐藏了。都不行吗?
如果不行的话,请问怎么解决呢?
2015-08-06 11:51
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 efeiwork :
返回键是需要监听的,mui默认会监听,网络地址并没有引用mui.js
2015-08-06 11:48
efeiwork

efeiwork

回复 DCloud_UNI_CHB :
为什么加载网络地址的时候,按返回键没有反应呢?
subWebview.loadURL('http://weibo.com/dhnetwork');
请教一下。
2015-08-06 11:31
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 efeiwork :
是的,需要append。预加载只是提前创建,所有5+ API都可以正常使用
2015-08-06 11:06
efeiwork

efeiwork

回复 DCloud_UNI_CHB :
是加这个吗?
template.append(subWebview);
好像加了之后就没这个问题了。
但我还是有很多疑问。
例如:预加载页面,他有哪些方法可以调用,没有相关API学些,如show()这些,不好意思,我是刚接触HB,我很感兴趣,现在也在很努力学习中。
2015-08-06 09:33
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 efeiwork :
子页面没有append到父页面吗?
2015-08-06 08:49
efeiwork

efeiwork

拜读了好几次这个文章了。也模仿做了一个类似MUI例子,但不知道为什么如果子页面还没有加载完(显示加载中...),我就按了左上角的返回键,结果父模板返回了,子页面却还在。有没有办法判断用户点击了返回键,而自动终止子页面的加载呢?这个问题困扰了我好几天了。希望能解答一下,谢谢!
2015-08-06 00:01