lafer
lafer
  • 发布:2015-05-09 14:15
  • 更新:2015-05-13 20:38
  • 阅读:2754

tab切换bug

分类:MUI

我设置了一进入就显示登录界面,登录成功进入主界面,主界面是一个Tab切换的三个页面,正常登录进入之后切换正常,但是我在一个tab里面加了一个退出登录的按钮,点了后退出到登录界面,再次登录进来,tab切换就出问题了,点了没有反应,不切换了

2015-05-09 14:15 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_FXY

DCloud_UNI_FXY

错误原因:

在setting.html里边你重新openWindow创建了一个新的login.html。导致home,tab又重新创建了一遍。

解决方案:
在setting.html注销登录的地方,plus.webview.getWebviewById('page-login').show();获取已存在的login.html直接进行show即可。

建议可以找一个4.4以上的手机。通过chrome来调试。可以很方便直观的看到目前创建的webview页面。

  • Danny

    左上角图标只显示一半的问题呢?

    2015-05-13 20:42

Danny

Danny - QQ125904483

顶,确实存在这个bug

Danny

Danny - QQ125904483

再顶,希望开发组能看见

lafer

lafer (作者)

官方发现这个问题吗

lafer

lafer (作者)

官方解决一下吧,我测试了plus.webview.show 这个好像没有执行

DCloud_UNI_FXY

DCloud_UNI_FXY

你是不是每次登陆成功后都会重新创建主页面?

如果是这样的话,是会有很多潜在问题。因为你每次进去就会创建主页面,而主页面又创建了其他子tab页。导致会一直重复创建。

你需要保证主页面始终只存在一个,包括子tab页。不要重复创建新的。

  • Danny

    @DCloud_MUI_FXY,指导下呗

    2015-05-13 16:32

Danny

Danny - QQ125904483

Login页面跳转到Home页面的代码:

var prelHeomPage;  

//预加载首页  
mui.plusReady(function() {  
    prelHeomPage = mui.preload({  
        url: "home.html",  
        id: "home.html"  
    });  
});  

//登录点击事件  
document.getElementById('btnLoginSubmit').addEventListener('tap', function() {  
    //验证输入  
    //TODO  

    //登录逻辑  
    //TODO  

    //登录成功后转到首页  
    prelHeomPage.show("pop-in", 100);  
});

莫非我要在预加载前判断下home.html是否已经存在,如果存在就不预加载了?
openWebView的方式转场之后当前的页面不会被销毁或释放,而是依然在后台存在?
只有back方式的转场才会销毁或释放资源?
那岂不是很多地方都得加判断啦呀....

DCloud_UNI_FXY

DCloud_UNI_FXY

你预加载的home那应该没问题。

发一个可以测试的工程

  • Danny

    怎么发给你呢?给个邮箱被

    2015-05-13 17:30

Danny

Danny - QQ125904483

测试工程见附件,根据引导说明就可以重现问题的(登录 -> 首页 ->设置 -> 注销 -> 登录 -> 首页,这时首页的tab切换就出问题了,另外左上角图标也只能显示一半)。

小云菜

小云菜 - 相关代码及分享在http://www.cnblogs.com/phillyx

你既然是注销了,自然其他页面的生存期就不需要了,关掉就可以了

if (mui.os.ios || mui.os.ipad || mui.os.iphone) {  
                                // 获取所有Webview窗口  
                                var curr = plus.webview.currentWebview();  
                                var wvs = plus.webview.all();  
                                for (var i = 0, len = wvs.length; i < len; i++) {  
                                    if (wvs[i].getURL() == curr.getURL())  
                                        continue;  
                                    plus.webview.close(wvs[i]);  
                                }  
                                plus.webview.open('../login/login.html');  
                                curr.close();  
                            } else  
                                plus.runtime.quit();
  • Danny

    Android中你这种方式应用程序直接退出了!

    2015-05-19 21:27

Danny

Danny - QQ125904483

调试了下,的确重复创建login、home、home-sub1、home-sub2、home-sub3,那就应该是:
1.openWindow的方式创建新的WebView对象,无论ID是否已经存在。
2.openWindow转场时当前的WV对象不会被销毁或释放。
3.只有back方式的转场WV才会被销毁或释放。
另外,有2点麻烦再确认下:
1.上述的情况意味着很多转场不能直接使用openWindow来创建,必须先判断ID是否存在?
2.预加载的情况是否和openWindow一致呢,如:
preHomePage = mui.preload({
url: "home.html",
id: "page-home"
});
如果已经存在就不能预加载了?

  • DCloud_UNI_FXY

    目前的预加载只在单页面内可以避免重复创建,比如。在login页面,你preload了home页面,

    那么在login页面使用openWindow打开home的时候,会识别home是否已存在。但是在其他页面openWindow打开home的时候,会直接创建,没有识别。


    建议自己处理好预加载和openWindow的关系。

    2015-05-13 21:07

  • Danny

    是不是使用plus.webview.getWebviewById('page-login').show();打开login页面后plusReady事件不会再次执行?

    2015-05-13 21:10

  • DCloud_UNI_FXY

    show的时候是不会触发plusReady的。

    2015-05-18 17:55

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