villayong
villayong
  • 发布:2015-06-15 11:46
  • 更新:2018-11-28 16:44
  • 阅读:27142

mui.min.js 更新到v1.8.0版本后,mui.plusReady有时会失效

分类:MUI

mui.min.js 更新到v1.8.0版本后,mui.plusReady在以下业务场景中失效

业务场景如下:
由列表页面A进入(调用mui.openWindow)到详情页面B,
B页面中mui.plusReady(function() {
alert("sss");
},此时可以正常触发plusReady。

再由详情页面B打开(mui.openWindow)一个操作页面C,C页面操作完了后,调用mui.openWindow 再打开B页面,此时B页面中plusReady失效,:无法执行函数体中代码

用之前的 v1.5.0是没这种问题的

这应该是一个很普遍的场景,还请大神们看下该bug,最好能尽快修正,谢谢!

2015-06-15 11:46 负责人:无 分享
已邀请:

最佳回复

DCloud_UNI_CHB

DCloud_UNI_CHB

mui v1.7.0开始重构了mui.openWindow方法的执行逻辑,详细参考:http://dev.dcloud.net.cn/mui/window/#openwindow

对于你的问题,若每次均需要打开新的webview,则传递createNew:true参数即可;

若不需要重复创建,但每次显示均需要获取不同参数,则可以通过自定义事件来模拟实现。

  • 闪闪

    一直createNew:true的话,app会卡死的。

    2016-04-20 16:33

  • DCloud_UNI_CHB

    回复 闪闪:确实不建议创建太多webview

    2016-04-21 09:16

  • 闪闪

    回复 DCloud_UNI_CHB:有一个场景,就是对于购物APP 商品页面进入店铺,再从店铺打开商品页,然后再进入店铺,会出现无限循环。在京东和淘宝都是这种情形,会一直持续下去,而且不是用打开过的webview显示,而是一直打开新的。

    2016-04-21 14:24

  • DCloud_UNI_CHB

    回复 闪闪:这个问题确实存在,建议此种情况下,还是尽量复用webview,瑕疵就是无法原路返回

    2016-04-21 17:43

  • 2***@qq.com

    https://ask.dcloud.net.cn/question/43764求解决!使用自定义事件监听alert触发了两次

    2017-05-26 10:42

_AJian_

_AJian_

自定义事件怎么实现。求思路

  • DCloud_UNI_CHB

    参考:http://dev.dcloud.net.cn/mui/javascript/#customevent

    2015-06-23 15:47

  • 8***@qq.com

    下面就是一个自定义事件。往左滑动:

    document.getElementById('pullrefresh').addEventListener('swipeleft', function(e) {

    //执行自定义操作

    });

    2017-03-24 17:18

DCloud_UNI_CHB

DCloud_UNI_CHB

你的理解是正确的,plusReady仅会在每次重新创建webview时触发;

  • 若之前关闭了A页面,再次调用mui.openWindow,发现系统中没有A页面,则会新建webview,则此时就会重新触发plusReady;
  • 若未关闭A页面,再次调用mui.openWindow,发现系统中存在A页面,就会直接show出来,不会触发plusReady。
  • stevenLuo

    如果A页面预加载了多个页面,怎么办啊?

    2016-05-06 16:47

  • DCloud_UNI_CHB

    回复 stevenLuo:假设A页面预加载了B,则B也仅会在创建时触发plusReady事件

    2016-05-06 16:59

  • stevenLuo

    回复 DCloud_UNI_CHB:如果在打开A页面时设置createNew: true,那对于里面的预加载页面还是不会触发plusReady事件?

    2016-05-06 18:00

  • stevenLuo

    顺便问一下,怎样在app启动页面做一些判断操作?怎样判断是否是第一次使用app?

    2016-05-06 18:01

  • DCloud_UNI_CHB

    回复 stevenLuo:使用http://www.html5plus.org/doc/zh_cn/storage.html#plus.storage.getItem存储一个标志位,启动页再通过getItem读取该标志位即可

    2016-05-06 18:07

  • stevenLuo

    回复 DCloud_UNI_CHB:我说的启动是刚刚进入app时,loading正在转的时候

    2016-05-06 18:28

villayong

villayong (作者)

谢谢!

  • Trust

    朋友,自定义事件的代码可以贴一下不!!!

    2015-06-19 14:43

无名2015

无名2015

b打开c,只是c页面把把b页面遮罩了,所以你只能看到c页面,
当你再从c到b的时候,openwindow把已有的b页面显示出来,遮罩了c页面,
而plusready是在b页面创建的时候puls基座加载完成时执行的,所以只会第一次创建的时候会执行一次.
但问题又来了,createNew参数为true是在什么场景下使用呢?还是只是为了兼容老版本?

DCloud_UNI_CHB

DCloud_UNI_CHB

createNew就是为了兼容老版本(开发者最小改动),及那些习惯将业务逻辑放在plusReady事件中的用户;

  • 云钦

    业务逻辑除了放到plusReady中还有其他思路?

    2015-08-16 15:12

  • szaos

    是啊 有没有 类似 onShow 这种的函数 代替plusReady啊 或者 什么init 函数,当页面展示的时候 第一时间回调

    2016-02-12 14:48

  • 4***@qq.com

    createNew设为true时会一直重新打开新的,这样按返回键时就一直返回,体验不好,怎么打开新的关闭之前的?

    2018-11-10 11:19

  • l***@live.com

    回复 4***@qq.com: 你可以在新开的页面获取打开它的上一个页面然后关闭它。

    类似 plus.webview.currentWebview().opener().close();

    2019-05-06 10:43

villayong

villayong (作者)

重大发现,也不是所有情况都不会进入plusReady中。

举例:
mui.openWindow("A.html"),createNew参数为true情况下,

只要未关闭过A.html,就不会进入plusReady中,

如果关闭过A.html,就会进入plusReady中。

所以关键是判断是否有关闭过该页面,从而考虑业务逻辑是放在plusReady中,还是自定义事件。

关闭A.html 页面方法,该页面调用了js mui.back().或者页面有 mui-action-back 样式的元素,
或者plus.webview.currentWebview().close();

还请官方大佬们确认下我的理解是否正确或者完整,接下来打算对自己的app做个性能优化,之前打开
页面用的createNew参数为false,app性能相当不好。经常闪退,不知道是不是因为打开了太多的Webview?

QAZWSC

QAZWSC

mui.plusReady(function() {
alert("1111");
});

这段代码没有执行是什么原因??确定Mui.js已经引进来了。

  • maq

    你是在浏览器里打开页面的吧?

    2016-01-28 10:18

张释

张释 - 码农

请问一下各位前辈,createNew:true 时,会覆盖掉之前打开的 id一样的 webview对吧?

  • 张释

    并不会覆盖掉 id已存在的webview,而是把id已存在的webview的id设置为空,然后再重新创建一个webview。也就是说,连续的 createNew:true,会连续的增加内存。

    2018-09-13 17:15

  • l***@live.com

    很遗憾,不会覆盖。所以 createNew:true 很容易就能把app卡死。

    2018-09-29 12:30

8***@qq.com

8***@qq.com

刚刚接触mui, 遇到以下问题,请教各位大神帮忙解惑哈,感谢了。。。。
a页面的代码如下:
mui('.pro').on('tap','a',function(e){ //防止多次点击
//e.preventBubble(); //阻止冒泡
e.preventDefault(); //阻止默认行为
mui.openWindow({
url:"b.html",
id:"pro",
show:{
duration:300
},
waiting:{
autoShow:true,//自动显示等待框,默认为true
title:'正在加载...',//等待对话框上显示的提示内容
options:{
width:'300px',//等待框背景区域宽度,默认根据内容自动计算合适宽度
height:'200px'//等待框背景区域高度,默认根据内容自动计算合适高度
}
}
})
})

跳转到b.html,b.html页面代码如下:
<script src="js/jquery-1.11.1.min.js"></script>
<script src="js/mui.js"></script>
<script type="text/javascript">
mui.init({
swiperBack:true, //启动右滑关闭功能
})
mui.plusReady(function(){
console.log("当前页面URL:"+plus.webview.currentWebview().getURL());
});
</script>

问题: 1. a页面跳转到b页面的时候,等待框没有显示出来。

  1. b页面的console.log 不执行。

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