HB_关平
HB_关平
  • 发布:2016-09-26 21:23
  • 更新:2018-08-28 19:14
  • 阅读:27611

Android平台5+ API提前生效,支持在plusready事件前调用

分类:HTML5+

ios上plus是一直存在的,不涉及等ready事件。但安卓上还是需要等plus ready。
在安卓环境中,通常情况下需要html页面解析完成后才会让5+ API生效,安卓的执行的顺序为:

  1. 加载html页面,loading
  2. 解析html页面(解析title节点、下载script/link等节点引用的资源,如js/css文件)
  3. 触发DOMContentLoaded事件
  4. 触发plusready事件
    此文对执行顺序有详细描述:http://ask.dcloud.net.cn/article/571

这样导致5+ API生效时间比较延后,通常采用以下代码等待plus ready后再调用5+ API:

document.addEventListener('plusready',function () {  
        // 在这里调用5+ API  
},false);

我们总是在不停追求性能优化,生效时间越早,我们可以把app的体验做的更好。
在HBuilder7.5版本之后安卓版支持提前注入5+ API,可以在plusready事件触发之前调用5+ API,操作方法是在页面中添加以下节点:
,示例如下:

<!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 type="text/javascript" charset="utf-8">  
// 这里可以调用5+ API了,为了更好的兼容性,应该使用以下代码进行判断  
if(window.plus){  
    // 在这里调用5+ API  
}else{// 兼容老版本的plusready事件  
    document.addEventListener('plusready',function () {  
        // 在这里调用5+ API  
    },false);  
}  
        </script>  
    </head>  
    <body>  
Hello HTML5 plus.  
    </body>  
</html>

注意

  1. 5+ API虽然可以提前生效,但为了不引发向下兼容问题,plusready事件并不会提前触发,该事件仍然保持原来的触发时机;
  2. 提前生效的Plus api,操作时需注意,此时DOMContentLoaded事件高概率未触发,此时操作dom会失败,操作dom也还是得等到DOMContentLoaded后;
  3. Android3.0及以上平台才支持提前生效,Android2.*版本不支持此功能;

应用场景举例

  • 定位
    很多app的页面是根据位置来显示内容的,如果在DOMContentLoaded后再请求位置,然后再提交服务器获取该位置周边的商家列表,这样就会慢。而提前使用plus api获取位置,就可以加速页面显示速度。尤其对于首页就要拉周边信息的app更重要。
  • 父子页面加载
    如果页面是父子webview布局,过去是父页面在触发plusready后再创建子页面,导致整体页面显出出来比较慢。如果让plus api提前生效,我们可以无需等待父页面plusready就直接创建子页面。
    另外,HBuilder在2017年起的版本,支持双首页,如果首页是父子页面,建议把这2个页面都配到manifest里形成双首页,此时原来的子页面并不需要等父页面的plus ready才创建。而非首页的二级页面,其实也不建议用父子页面,而是使用nativeobj里的原生view来做title,不用webview来做title。

应用场景还有很多,优化无极限,欢迎高手继续研究。

14 关注 分享
Trust Android_XR lhyh NewsNing jwenlee Element MUI_Charles x***@foxmail.com 赵梦欢 可苦可乐 川川 8***@qq.com 羊腰子 dipper

要回复文章请先登录注册

DCloud_heavensoft

DCloud_heavensoft

回复 AJXMJC :
没有这个if。这个功能没有浏览器兼容问题。如果有问题,可能是配套的其他代码引发的,可以通过自查代码解决。
2018-08-28 19:14
AJXMJC

AJXMJC

加上这个<script src="html5plus://ready"></script> 在 android 5.x +上面没有问题,但是在 android 4.x 出现很多bug。
所以有没有办法 <script src="html5plus://ready" if="android 5+"></script> 这样子判断 android5+才生效?
2018-08-28 11:55
白羽

白羽

插入下面这句之后,对iOS有什么影响吗?
<script src="html5plus://ready"></script>
2018-08-19 22:25
特洛伊

特洛伊

神坑,一定要把<script src="html5plus://ready"></script>写在mui.js前面,不然会报错:undefined is not a function
2018-08-14 16:19
张张张啊

张张张啊

注入之后上拉加载下拉刷新报错了,请问什么原因。 Uncaught TypeError: g.pullRefresh is not a function
2018-07-02 11:42
4***@qq.com

4***@qq.com

这个对api对离线打包的支持情况怎么样
2018-06-30 07:55
error__404

error__404

真的太多坑了,本来iOS调试好好的, 一换安卓机就各种plusready报错,看了这个才知道这个兼容方法。。。
2018-06-11 16:36
DCloud_heavensoft

DCloud_heavensoft

回复 老王Plus :
iOS不需要引入script节点,默认就是提前生效的
2017-01-20 01:03
老王Plus

老王Plus

这个只在android下有效吗?IOS呢?
2016-09-29 23:21
Element

Element

和mui.plusReady有冲突
2016-09-29 08:24