1***@qq.com
1***@qq.com
  • 发布:2018-07-04 13:48
  • 更新:2018-07-04 23:29
  • 阅读:4245

window.plus在真机运行时候undefined

分类:HTML5+

我时H5集成的安卓应用
当我在hbuilder的真机测试的时候,整个代码可以完美运行;
但是我打包成apk后在手机运行,window.plus会报undefined;
这样也导致var xhr_svn = new plus.net.XMLHttpRequest();会报错
"plus is not defined"
请问这是什么问题导致的?

2018-07-04 13:48 负责人:无 分享
已邀请:
Trust

Trust - 少说废话

耐心读一下如何正确高效地在社区提问,然后提供下文中提到的必要的信息,最好能提供一个有问题的apk以供测试。

参考文章:
http://ask.dcloud.net.cn/article/165
http://ask.dcloud.net.cn/article/30
http://ask.dcloud.net.cn/article/122

如果不引入 mui 的话,可以自己参考 mui 的源码封装一个相关的 plusReady 方法,示例如下:

var plusReady = function (callback) {  
  if (window.plus) {  
    callback();  
  } else {  
    document.addEventListener('plusready', callback);  
  }  
}

解决方法:

  • 更新 HBuilder 到最新版,你这个版本落后太多了,可能会存在一些目前已解决的bug。
  • 将涉及到 5+API 调用的代码,都放在 plusReady 中。
  • 虽然是 C/S 结构的应用,但是 script 标签最好还是放在 body 标签结束前。如果不是很明白为什么,百度会告诉你。
  • 1***@qq.com (作者)

    您好,我看了您给的几个参考文章,这几个文章之前我都用尝试过,我出现的问题是hbuilder真机测试的时候 document.addEventListener('plusready', callback);可以触发callback,但是在打包apk后运行应用就无法触发,这导致我无法使用5+API;

    并且我有尝试用MUI的框架,但是同样的是我在Hbuilder真机测试的时候可以触发,mui.plusReady(),但打包以后就无法触发,mui.plusReady();

    灵,我是离线打包的,,用mui框架写的代码po在最后了,请看一下~

    2018-07-04 21:57

1***@qq.com

1***@qq.com (作者)

代码:

<!DOCTYPE html>  
<html>  
  <head>  
    <meta charset="utf-8">  
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">  
    <title>Ionic Seed App</title>  

    <!-- ionic css -->  
    <link href="lib/ionic/css/ionic.css" rel="stylesheet">  
    <!-- your app's css -->  
    <link href="css/clj_common.css" rel="stylesheet">  
    <link href="css/clj_all.css" rel="stylesheet">  
    <!-- ionic/angularjs scripts -->  
        <script src="lib/ionic/js/ionic.bundle.js"></script>  
    <!-- cordova script (this will be a 404 during development) -->  
    <script src="cordova.js"></script>  
    <!-- your app's script -->  
    <script src="js/app.js"></script>  
    <script src="js/services.js"></script>  
    <script src="js/controllers.js"></script>  
    <script src="js/md5js.js"></script>  
    <script src="js/jquery_1.9.1.js"></script>  
    <script src="js/ng-cordova.js"></script>  

    <script src="html5plus://ready"></script>  
    <script type="text/javascript" charset="utf-8">  
            // 这里可以调用5+ API了,为了更好的兼容性,应该使用以下代码进行判断  
            window.onerror = function (message, url, line, column, error) {  
  alert('log---onerror::::'+message+' '+url+' '+line+' '+column+' '+error);  
}  

            alert('window.plus is'+window.plus);  

     </script>  
  </head>  
    <body ng-app="Doctor" animation="slide-left-right-ios7">  
        <ion-nav-view></ion-nav-view>  
    </body>  
    <script>  
        var version='1.1.4';  

        //检查自动更新  
        function svn(old_version) {  
            alert("svn");  
    var xhr_svn = new plus.net.XMLHttpRequest();  
    alert('lilili');  
    xhr_svn.onreadystatechange = function() {  
        alert(xhr_svn.readyState);  
        if (xhr_svn.readyState == 4) {  
            alert(xhr_svn.status);  
            if (xhr_svn.status == 200) {  
                var res = JSON.parse(xhr_svn.responseText);  
                alert("res:"+res);  
                alert("res的类型:"+ typeof res);  
                alert("res.update:"+res.update);      
                }    
            } else {    
                plus.nativeUI.toast( "网络连接错误!");    
            }    
        }    
    }    
    xhr_svn.open("GET","http://121.40.144.109:19090/myopic-dev/resources/update_ShortSightednessDoctor.json");//这里的地址是上面json文件的地址    
    xhr_svn.send();    
    };  

         if(window.plus != undefined){  
                // 在这里调用5+ API  
                alert('hello');  
                svn(version); //更新版本同时要更新svn中参数  
            }else{// 兼容老版本的plusready事件  
                 alert('如果能出现hi,说明进入api加载完成的回调函数,否则api没有加载完成');  
                document.addEventListener('plusready',function () {  
                    // 在这里调用5+ API  
                    alert('hi');  
                    svn(version); //更新版本同时要更新svn中参数  
                },false);  
            }  
//          svn(version); //更新版本同时要更新svn中参数  
        </script>  
</html>  

我用的是HBuilder

8.8.0.201706142254

测试手机用了好几部,都是一样的结果

希望大佬快来捞我一把~马上要抑郁了啊~~~

  • Trust

    已更新回复,请仔细阅读相关文章。此问题比较典型,由于并没有确保扩展API加载完成就直接调用造成的。

    2018-07-04 20:30

  • 1***@qq.com (作者)

    回复 Trust:好的,我先看一下,谢谢~

    2018-07-04 21:05

1***@qq.com

1***@qq.com (作者)

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8"/>  
        <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"/>  
        <title>HTML5+ API</title>  
        <script src="html5plus://ready"></script>  
        <script src="js/jquery_1.9.1.js"></script>  
        <script src="js/mui.min.js"></script>  

        <script>  
        window.onerror = function (message, url, line, column, error) {  
alert('log---onerror::::'+message+' '+url+' '+line+' '+column+' '+error);  
}  
      (function(mui, doc) {  
        alert('eee');  
                    mui.init({  
                    });  
                    mui.plusReady(function() {  
                    alert("here");  
                    var xhr_svn = new plus.net.XMLHttpRequest();  
        xhr_svn.onreadystatechange = function() {  
                alert(xhr_svn.readyState);  
        }  
        xhr_svn.open("GET","http://www.inwoold.com/myopic-dev/resources/update_ShortSightednessDoctor.json");//这里的地址是上面json文件的地址    
                xhr_svn.send();   
                    });  
                    }(mui, document));  

        </script>  
    </head>  
    <body>  
Hello HTML5 plus.  
    </body>  
</html>

后来有换成mui尝试,hbuilder基座真机测试也是可以完美运行,然而打包apk以后eee弹出来了,mui.plusReady没有触发,

DCloud_heavensoft

DCloud_heavensoft

我看你代码里写了plus的提前注入,还有一种可能的原因是你的其他代码里有对plus进行重定义,搜一下里面有没有plus这个变量或函数。
js是后定义生效的,提前注入plus虽然让plus这个变量生效了,但如果后面有js重定义了plus,plus就不再是5+的对象了

  • 1***@qq.com (作者)

    你好,我在代码里全面检查了一下,没有其他代码用到plus或对其重定义的操作,因为我是本地打包的,我本来猜想是不是因为有什么依赖包没有配置,所以早上的时候我根据官方文档下了5+SDK对项目进行配置后再次打包,还是不可以....

    2018-07-05 10:38

  • DCloud_heavensoft

    回复 1***@qq.com:那就是本地打包环节有问题,但你这么说,谁也看不出问题来。。。

    2018-07-05 16:02

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