MUI_Charles
MUI_Charles
  • 发布:2016-09-21 14:19
  • 更新:2016-09-21 18:13
  • 阅读:4972

关于webview.addEventListener('loaded',CB) 与fire传值、plusReady的困惑

分类:HTML5+

首先说明 webview的功能是正常的,问题在于plus is not defined居然没找到到底是哪个页面哪个函数报错。
这个是自己封装的openWindow

owner.openWindow = function(target, title, normalOpen, callback) {  
        if(owner.isapp) {  
            if(target) {  
                var turl = owner.getRootPath() + "/template.html";  
                var id = "" + target  
                var tmpl = plus.webview.create(turl, id)  
                tmpl.addEventListener('loaded', function() {  
                    mui.fire(tmpl, 'update', {  
                        title: title,  
                        target: encodeURI(target)  
                    });  
                    tmpl.show('slide-in-right')  
                })  

            } else {  
                if(callback) {  
                    callback();  
                }  
            }  

        } else {  
            normalOpen();  
        }  

    }

这一段是模板页面的js


        window.addEventListener("update", function(e) {  
                        window.onerror = function(e){  
                console.log(e)  
                alert(e)  
                }  
            var titleElem = document.getElementById("title"),  
                menuElem = document.getElementById("menu"),  
                self = plus.webview.currentWebview(),  
                substyles = {  
                    top: '65px',  
                    bottom: '0px'  
                };  
            var title = e.detail.title;  
            var showMenu = e.detail.showMenu;  
            var href = e.detail.target;  
            var aniShow = e.detail.aniShow;  
            var sub = plus.webview.create(href, title, substyles);  
            sub.addEventListener('loaded', function() {  
                self.append(sub);  
            })  
            sub.addEventListener('error', function(err) {  
                console.log(err);  
            })  

            mui.back = function() {  
                self.close('slide-out-right');  
            }  

            titleElem.innerHTML = title;  
            titleElem.className = "mui-title mui-fadein";  
            var display = showMenu ? "" : "none";  
            if(showMenu) {  
                mui.options.keyEventBind.menubutton = true;  
            } else {  
                mui.options.keyEventBind.menubutton = false;  
            }  
            menu.style.display = display;  

            //状态栏预留  
            $("header").css("padding-top", plus.navigator.getStatusbarHeight() + "px");  
            $("#back").show();  
            $("#title").show();  

            menuElem.addEventListener('tap', function(e) {  
                e.stopPropagation();  
                if(contentWebview == null) {  
                    contentWebview = plus.webview.currentWebview().children()[0];  
                }  
                contentWebview.evalJS('mui("#topPopover").popover("toggle")');  
            });  

            mui.menu = function() {  
                console.log(menuElem.style.display);  
                if(menuElem.style.display !== "none") {  
                    if(contentWebview == null) {  
                        contentWebview = plus.webview.currentWebview().children()[0];  
                    }  
                    contentWebview.evalJS('mui("#topPopover").popover("toggle")');  
                }  
            }  
        });

这一段是模板页的subview页面

<html>  

    <head>  
        <meta charset="utf-8">  
        <title>设置</title>  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1, user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  
        <link href="../assets/mui/css/mui.min.css" rel="stylesheet" />  
        <link rel="stylesheet" type="text/css" href="../css/base.css" />  
        <link href="../assets/mui/css/app.css" rel="stylesheet" />  
        <link href="../css/settings.css" rel="stylesheet" />  
    </head>  

    <body>  
        <a href="mydetail.html" class="mui-table">  
            <div class="mui-table-cell mui-col-xs-10 icon-myfile">  
                账户与安全  
            </div>  
            <div class="mui-table-cell mui-col-xs-2">  
                <span class="mui-icon mui-icon-forward listiocn"></span>  
            </div>  
        </a>  
        <a href="mydetail.html" class="mui-table" style="margin-bottom: 10px;">  
            <div class="mui-table-cell mui-col-xs-10 icon-myfile">  
                提醒设置  
            </div>  
            <div class="mui-table-cell mui-col-xs-2">  
                <span class="mui-icon mui-icon-forward listiocn"></span>  
            </div>  
        </a>  

        <a href="mydetail.html" class="mui-table">  
            <div class="mui-table-cell mui-col-xs-10 icon-myfile">  
                联系我们  
            </div>  
            <div class="mui-table-cell mui-col-xs-2">  
                <span class="mui-icon mui-icon-forward listiocn"></span>  
            </div>  
        </a>  
        <a href="mydetail.html" class="mui-table" style="margin-bottom: 10px;">  
            <div class="mui-table-cell mui-col-xs-10 icon-myfile">  
                关于我们  
            </div>  
            <div class="mui-table-cell mui-col-xs-2">  
                <span class="mui-icon mui-icon-forward listiocn"></span>  
            </div>  
        </a>  

        <a href="mydetail.html" class="mui-table">  
            <div class="mui-table-cell mui-col-xs-10 icon-myfile">  
                检查更新  
            </div>  
            <div class="mui-table-cell mui-col-xs-2">  
                <span class="mui-icon mui-icon-forward listiocn"></span>  
            </div>  
        </a>  

        <button id="logout">退出登录</button>  

    </body>  
    <script src="../js/zepto.min.js" type="text/javascript" charset="utf-8"></script>  
    <script src="../assets/mui/js/mui.min.js"></script>  
    <script src="../js/app.js" type="text/javascript" charset="utf-8"></script>  
</html>  

报错为

Uncaught SyntaxError: Unexpected token ILLEGAL
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api) at assets/mui/js/mui.min.js:6
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api) at assets/mui/js/mui.min.js:6
Uncaught ReferenceError: plus is not defined (提示: 请在plus ready后再调用plus api)

第一个和最后一个没有具体位置

模板页面那个onerror没进

现在觉得 是openWindow里面webview.addEventListener('loaded',CB)这个loaded是监听的DOM Ready而不是plusReady 导致我模板页监听update事件的时候 里面的plus调用报错

但是现在功能都正常 模板webview 模板subview都能够正常显示。

想了解一下 这个loaded到底监听到DOM渲染、js执行、plusReady哪一些。

现在基本确定loaded是监听不到plusReady的(ios9.3.3是正常的,Android有问题 ) 因为之前监听update事件是写在plusReady里面的,导致随机进入update的callback里面。意思就是在plusReady中JSBirdge还没加载完成的时候 就已经向模板页面fire了update事件,还没解析到我的addEventListener('update')。

感觉踩了一个大坑,以上的分析都只是猜想。
目前功能都正常 模板webview 模板subview都能够正常显示。
但是报错定位无能为力。

2016-09-21 14:19 负责人:无 分享
已邀请:
lhyh

lhyh - 目前就职成都

你把你引用的mui.min.js 替换成对应版本的 mui.js,不就定位了哪里报错了……调试的时候可用mui.js去调试,是一样的

  • MUI_Charles (作者)

    定位到mui.js里面没什么用啊 我要定位哪个页面里面报错

    2016-09-21 14:35

  • MUI_Charles (作者)

    以及该页面的哪里的函数调用导致的报错

    2016-09-21 14:36

  • lhyh

    回复 MUI_Charles:定位哪个页面是吧,你在你的这个公用方法里多接受一个参数代表页面,其它地方调用方法的时候把当前页面的url或者title传进去,console.log一把不就知道了

    2016-09-21 14:48

  • MUI_Charles (作者)

    可以一试。Thanks anyway.

    2016-09-21 15:11

Trust

Trust - 少说废话

首先Uncaught SyntaxError: Unexpected token ILLEGAL,应该是某个符号写成中文的符号了。
其次,涉及5+API的需要在plusready后调用。
window本身是有load以及DOMContentLoaded事件,plusready用于监听5+API的加载,与DOM等加载无关。
最后,如果自定义事件中涉及5+API的调用,建议还是在plusready后再添加事件监听,这样就不会产生plus is not defined错误。

参考相关文档
HTML中如何安全调用5+ API (plus is not defined)
页面初始化

  • MUI_Charles (作者)

    之前监听update事件是写在plusReady里面的 但是安卓下fire的时候有时监听不到 有时监听得到ios正常

    2016-09-21 14:43

  • MUI_Charles (作者)

    mui可否增加一个监听plusReady事件

    2016-09-21 18:21

MUI_Charles

MUI_Charles (作者)

setTimeout(function() {  
                        mui.fire(tmpl, 'update', {  
                            title: title,  
                            target: encodeURI(target)  
                        });  
                    }, 200)

延时fire算是解决了。
其次 Uncaught SyntaxError: Unexpected token ILLEGAL 是因为

var sub = plus.webview.create(href, title, substyles);

的title里面带中文

最后 延时fire是一个折中的办法。
我的需求是向模板页面fire一个update事件 然后模板接收到update事件的时候创建一个子webview
要遵循两个mui原则。第一,要在模板的loaded之后 再fire。第二,要在模板的plusReady之后创建subview。然后我发现监听update事件不论放在时间线上的哪个点 都不能正常监听。只能延时fire保证mui.plusReady在fire之前执行

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