哲
  • 发布:2018-03-04 11:02
  • 更新:2018-03-14 16:56
  • 阅读:2107

【报Bug】iOS侧滑返回关闭Webview窗口不触发close事件

分类:HTML5+

详细问题描述
iOS侧滑返回是隐藏Webview窗口的情况能够正确触发hide事件,但iOS侧滑返回是关闭Webview窗口的情况却不触发close事件。

重现步骤
在首页点击 “页面1” 打开一个新窗口(该窗口的侧滑返回动作是hide隐藏窗口),然后侧滑返回能正确触发webview的hide事件;
在首页点击 “页面2” 打开一个新窗口(该窗口的侧滑返回动作是close关闭窗口),然后侧滑返回则不会触发webview的close事件(问题就在于此,不会触发close事件)。

index.html

<button onclick="toPage1()">页面1(iOS侧滑返回隐藏webview窗口)</button>  
<button onclick="toPage2()">页面2(iOS侧滑返回关闭Webview窗口)</button>  
<script>          
var webviewStyle = {  
    titleNView: {  
        titleColor: '#FFFFFF',  
        backgroundColor: '#2DAF5A',  
        autoBackButton: true  
    }  
};  
function toPage1(){  
    webviewStyle.popGesture = 'hide'; //侧滑返回隐藏webview窗口  
    webviewStyle.titleNView.titleText='页面1(iOS下)';  
    var webview = plus.webview.create('page1.html', 'page1.html', webviewStyle);  
    webview.show('pop-in');  
}  
function toPage2(){  
    webviewStyle.popGesture = 'close'; //侧滑返回关闭Webview窗口  
    webviewStyle.titleNView.titleText='页面2(iOS下)';  
    var webview = plus.webview.create('page2.html', 'page2.html', webviewStyle);  
    webview.show('pop-in');  
}     
</script>

page1.html

<script>  
    document.addEventListener('plusready', function() {       
        plus.webview.currentWebview().addEventListener('hide', function() {  
            console.log('窗口隐藏...');//当侧滑返回隐藏该窗口,这里正确触发  
        }, false);        
        plus.key.addEventListener('backbutton', function() {  
            plus.webview.currentWebview().hide('auto');  
        }, false);        
    });  
</script>

page2.html

<script>  
document.addEventListener('plusready', function() {   
    plus.webview.currentWebview().addEventListener('close', function() {  
        console.log('窗口关闭...'); //当侧滑返回关闭该窗口,这里不会触发  
    }, false);    
    plus.key.addEventListener('backbutton', function() {  
        plus.webview.currentWebview().close('auto'); //点击左上角的返回箭头关闭该窗口时能正确触发 close 事件  
    }, false);    
});  
</script>

运行环境
Hbuilder 9.0.1以及先前的版本

2018-03-04 11:02 负责人:无 分享
已邀请:
hylong

hylong

侧滑是监听popGesture事件,不是close。将close改成popGesture即可。

  • (作者)

    我不那么认为,监听popGesture事件与触发hide事件和close事件是两码事,首先我认为,只要窗口被close了那就必须触发close事件,只要窗口被hide了那就必须触发hide事件。

    现在的问题是侧滑返回是hide窗口的情况能够触发hide事件,而侧滑返回是close窗口的情况却不能够触发close事件,这不符合常理啊

    2018-03-05 16:06

  • (作者)

    而目前临时的解决方式只能这样


    var popGestureFlag = false;

    plus.webview.currentWebview().addEventListener('popGesture', function() {

    if(!popGestureFlag) {

    popGestureFlag = true;

    //执行具体的操作

    }

    });


    监听 popGesture 事件会根据你侧滑动作的快慢触发N次

    2018-03-05 16:10

  • 回梦無痕

    回复 :监听popGesture有点复杂。因为有时候用户只是侧滑了一下,但并没有把页面滑到关闭,这个时候也会触发。

    2018-03-05 16:36

回梦無痕

回梦無痕 - qq565766672,论坛私信不回,有需要请加QQ,付费咨询指导。

不是不触发,而是还没有来得及触发页面就被close了。一般来说,不要再当前页面监听当前页的close,如果close事件里的代码逻辑执行时长大于页面close时长,就会出错。
index.html文件中,toPage2函数改成下方代码,就能正确的触发close:

function toPage2(){  
            webviewStyle.popGesture = 'close'; //侧滑返回关闭Webview窗口  
            webviewStyle.titleNView.titleText='页面2(iOS下)';  
            var webview = plus.webview.create('page2.html', 'page2.html', webviewStyle);  
            webview.show('pop-in');  
            webview.addEventListener('close', function() {  
                    console.log('窗口关闭...'); //当侧滑返回关闭该窗口,这里不会触发  
            }, false);  
        }

这里可以推测一下,
plus.webview.currentWebview().close();
事件的触发顺序是:close事件>close页面

滑动关闭事件的触发顺序是:close页面>close事件

  • (作者)

    的确,不在当前页面监听当前页的close事件则没有问题,或许这就是原因所在吧

    2018-03-05 16:26

哲

(作者)

的确,不在当前页面监听当前页的close事件则没有问题,或许这就是原因所在吧

哲

(作者)

项目中最终的绕过解决办法是:将由原来侧滑返回为close窗口的全部改成侧滑返回为hide窗口,因为在当前页面内监听的hide事件能够正确触发,然后再在hide事件里面再执行关闭当前窗口,这样在当前页监听的close事件也就能够被触发了,毕竟,有很多情况下页面在close的时候需要在当前页面内执行一些相关的触发操作会方便很多。

  • 回梦無痕

    我一般都不会把页面close,因为页面一般都会重用,页面更新一下数据就可以show,省去了很多重新创建页面的步骤,速度也更快。

    2018-03-14 17:26

  • (作者)

    是的,当一个项目大量页面的时候那些复用率低或着说低频的页面还是必须得关闭销毁,所以在当前页监听close事件然后要触发点某某操作也是刚需啊

    2018-03-14 17:42

要回复问题请先登录注册