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

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

要回复文章请先登录注册

云落

云落

能提供完整的demo源码么?HBuilder找了下,没发现list.html。新手+1
2016-02-24 19:53
言和

言和

先mark!
2016-02-23 14:48
言和

言和

回复 DCloud_UNI_CHB :
新手,能提供个完整的demo源码看看吗?
2016-02-23 09:42
保级队球迷

保级队球迷

使用父子模版template如何传递参数?比如说父界面有一个要支付的金额,子界面是银行卡列表选择一项做支付,如何把金额传递到子界面?
2016-01-26 12:21
Back

Back

楼主你好,这个方法很好,可以减少webview的数量,也不用一开始将太多页面load进subpage。但是我在使用中遇到个问题想请教下。
1.我现在分了content和menu两块内容,
2.content里面就是负责loadURL展示内容的
3.menu是右侧菜单,写了方法点击切换高亮的效果,代码如下:
mui('.right_menu').on('tap', 'li a', function(e) {
var menu_id=this.parentNode.parentNode.parentNode.getAttribute("id");
var method=this.parentNode.getAttribute("data-method");
var href=this.parentNode.getAttribute("data-href");
var li_list=mui("#"+menu_id+" li");
for(var i=0;i<li_list.length;i++)
{
li_list[i].className=li_list[i].className.replace("active","");
}
this.parentNode.className+=" active";
var self = plus.webview.currentWebview();
var parent=self.parent();
parent.evalJS('loadContent("'+href+'","'+type+'","'+((noSideBar==null)?0:1)+'")');
});
然而经常是content里面内容先加载完成了,然后右边菜单的切换效果才会生效。我试过注释掉evalJS的代码,菜单切换效果是没有问题很流畅的,但是一旦调用了evalJS后右边menu的切换效果就会卡顿1-3秒不等。
2016-01-19 03:34
qmit

qmit

这么多坑,叫俺这新手都有打退堂鼓的想法了。
2015-11-11 10:36
浓咖啡

浓咖啡

而且最严重的是,经常出现新的页面点击标题栏的返回按钮没有反应,得重启才管用。
2015-11-10 13:21
浓咖啡

浓咖啡

这种模式bug太多了,上面“上交国家”用户说的很对,我都遇到了。
2015-11-10 13:19
上交国家

上交国家

回复 DCloud_UNI_CHB :
openwindow方式也是可以,就是滚动条会顶过头部不好看,只能把打开的页面再subpages拆分成两个webview,这样一但页面多的情况下会坑死人吧
2015-11-02 15:54
DCloud_UNI_CHB

DCloud_UNI_CHB (作者)

回复 上交国家 :
A-B-C-D这种纵向情况,不建议使用这种模板方案
2015-11-02 15:46