Eason
Eason
  • 发布:2016-02-21 23:49
  • 更新:2019-05-22 15:02
  • 阅读:6615

show事件出现监听不到的情况【已解决】

分类:MUI
mui

页面结构为“列表+详情”,没有采用预加载的方式打开,具体情况如下:

点击列表页直接使用mui.openWindow()打开详情页。代码如下:

mui.openWindow({  
                id:'invoice-detail.html',  
                url:'invoice-detail.html',  
                show:{  
                    aniShow:'pop-in',  
                },  
                waiting:{  
                    autoShow:false,  
                },  
                extras:{  
                    objId:objId  
                }  
            }); 

详情页的plusReady中创建了当前页的show监听事件。代码如下:

mui.plusReady(function() {  
            var self = plus.webview.currentWebview();  
            self.addEventListener('show',function(){  
                console.log('show detail');  
                console.log('id:'+self.objId);  
                // ... 后续为渲染页面代码  
            });  
        });

遇到的问题是:当多次点击列表页进入详情页,并不是每次都能触发show事件。

【结论】
1、预加载时,执行mui.back隐藏页面
2、非预加载时,执行mui.back关闭页面
3、webview有show事件及hide事件

导致本次问题的原因是页面未采用预加载方式,每次都是重新创建webview导致show事件监听不稳定。
感谢@DCloud_MUI_FXY和@maq帮助

关闭页面相关的文档。
http://dev.dcloud.net.cn/mui/window/#closewindow

2016-02-21 23:49 负责人:无 分享
已邀请:
maq

maq

什么?!webview 有 show 事件?文档里没有啊。真有的话就太好了,正盼着呢!

  • Eason (作者)

    我在文档里也没找到,后来看到一个官方的同学提到就用了。别高兴的太早,说不定是有bug所以没放出啊。调试通过求分享解决方案。

    2016-02-22 09:59

DCloud_UNI_FXY

DCloud_UNI_FXY

应该预加载。否则你等于每次创建新的,并且直接show。那你监听show方法没意义啊,直接在plusReady里边拿objId就行了。

Eason

Eason (作者)

@DCloud_MUI_FXY 几个问题:
1、plusReady不是只有页面第一次创建才会调用吗,不能直接接受参数来处理业务。
2、不预加载也不会每次都创建新的吧,mui.openWindow默认是不重复创建页面的。
3、现在的情况不是监听不到show方法,而是有时可以有时不行,怀疑是监听事件的bug,另外官方的文档中也没有提到show这个事件。

DCloud_UNI_FXY

DCloud_UNI_FXY

之所以触发不稳定,是因为你在目标webview的plusReady里才addEventListener。。这个时候,有可能目标webview已经show了。但是你还没有添加事件。所以你需要把addEventListener事件放到列表页,然后列表页再去通知目标webview

Eason

Eason (作者)

@DCloud_MUI_FXY
但是按照道理说,只要第一次plusReady代码已经设置了show事件的监听。监听器就在那里,只要没有关闭页面,之后应该都能触发show事件吧。我现在的情况是,多点几次后就会出现触发不了的情况了。
你给的解决方案是在列表页预加载详情页,然后直接设置详情页的show方法是吗?
另外我之前说的几个观点应该都是正确的吧?

DCloud_UNI_FXY

DCloud_UNI_FXY

好像有点不对。。。你打开之后,back是自己手写的hide?还是mui内置的back。mui内置的back。会close掉你的webview的。下次仍是重新创建的。除非你手动hide,或者预加载

maq

maq

现在这个 show 事件没有提供文档,所以不清楚其具体的特性。关键的一点是,show 事件是仅在第一次 show() 的时候触发,还是在每次 show() 的时候触发,还是只在 isVisible == false 的时候调用 show() 才触发。

DCloud_UNI_FXY

DCloud_UNI_FXY

你先要确认是不是每次都是新创建的webview,如果是,那根据你的代码就有可能触发不稳定
http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewEvent

Eason

Eason (作者)

@DCloud_MUI_FXY
也就是说,预加载的页面,调用mui.back是隐藏而不是关闭,其他情况下mui.back都是关闭页面?这和我理解的有点出入,麻烦能提供下相关的文档吗

  • DCloud_UNI_FXY

    目前暂未详细描述的文档。。直接openWindow我们只能判断是否已存在,已存在直接显示,但是back的时候,我们是不知道该webview是应该hide还是close,所以只有用指定的预加载之后,我们才hide,其他情况close。

    2016-02-22 20:01

maq

maq

嗯,试验结果如下:

① webview 对象有 show 事件,也有 hide 事件。

② show 事件在每次调用 webview.show() 的时候都会触发。

③ hide 事件只有当 webview.isVisible() == true 的时候调用 webview.hide() 才会触发。

  • Eason (作者)

    有想到这两个事件的妙用吗

    2016-02-23 10:33

y***@163.com

y***@163.com

经过测试,A窗口openWindowB窗口,在B窗口中增加show事件的监听是可行的,但是有要求。。。往下看

1.首先 mui.currentWebview.addEventListener 要放到 mui.plusReady内,不然mui.currentWebview可能会null

  1. 重点来了,openWindow参数要带有event: 'loaded',也就是说B页面完全加载后再show出来。

A窗口完整的代码

var win = mui.openWindow("login.html","login.html",{  
                show:{  
                    aniShow:"slide-in-bottom",  
//                          duration: 2000,  
                    extras:{  
                        acceleration: "capture"  
                    },  
                    event: 'loaded',  
                    "1":""  
                },  
                waiting:{  
                    autoShow:false  
                }  
            })

B窗口完整代码

mui.plusReady(function() {  
            mui.currentWebview.addEventListener("show",function () {  
                console.info("show")  
            })  
        });

以上代码,不显示设置 event=loaded 时,是无法console出show的

1***@qq.com

1***@qq.com

您好 我想问一下我的监听show的方法 在android上可以监听到,在ios上监听不到是什么原因呢
ws = plus.webview.currentWebview();
wo = ws.opener();
// 开始扫描
ws.addEventListener('show', function() {
alert(123);
}, false);

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