非常多人都想、甚至曾使用HTML5开发跨平台App。而且想达到原生App的体验。

最后的结果都是无奈的放弃。HTML5貌似美好,但坑太多。想做到原生App的体验差点儿不可为。

也曾有过著名的facebook放弃HTML5改用原生做App的事件。

可是坑多不怕,就怕没人填。

本系列文章。就将我在开发中的各种HTML5的坑怎样解决。一一道给大家。

HTML5的性能体验比原生差。体如今非常多方面。比方切页时白屏、Android上列表滚动不流畅、下拉刷新和上拉翻页卡顿。

尤其在低端Android手机上,表现差距很明显。

我们首先来看第一个问题,怎样避免切页白屏。

浏览器的页面在切换时。因为其页面载入机制,在跳转到下一个页面时,先要请求联网、载入页面代码、构建dom、渲染,最后才显示出来。
在终于结果渲染完成前,会出现几十毫秒甚至数秒的白屏。原生App是没有这个问题的。

尽管使用SPA应用模型,即ajax+div切换也能够避免白屏,但把全部页面写在一个SPA页面里,手机上也跑不起来。

办法事实上是有的,须要使用扩展的手段。
在HBuilder(http://www.dcloud.net.cn)工具里。内置了[HTML5+](http://www.html5plus.org)的规范API,它把几十万原生API映射为js对象。
想要解决切页白屏这个问题。须要使用plus.webview类来做MPA应用。
plus.webview类是对原生的webview对象的js化封装。使用js能够操作webview。

解决白屏的原理是:**把每一个页面当作一个webview,但用js来控制它就像控制div一样。

**
由于webview能够隐藏创建。后台加载内容,而且在加载完成时有js事件通知。我们能够利用它做窗口切换。从而避免白屏。

通过操作webview来避免切页白屏,有2种常见的做法:  
一种是称之为预载,即后台预载新页面的基础文件。使用时直接调出来;
还有一种称之为现载,即点击前页的链接開始走waiting转圈,后台载入完整的新页面,载入完再用js控制显示到前台。

- 1、预载,新页面基础模板。使用时直接调出来
在HBuilder里新建App时有一个csdn的项目源代码。这个应用就是使用了预载思路。
启动首先载入资讯列表list页面,然后延时创建了一个隐藏的webview。载入了一个内容模板show页面(app/show.html)。
在点击list页面的一个新闻item时,调用webview的窗口控制动画,把show页面側滑进屏幕。
但show页面不过一个模板而没有数据,在show页面刚側滑进屏幕时,在show页面有一个正在联网的提示。

紧接着show页面開始运行ajax请求,联网载入数据并显示出来。
我们能够在list页面的item点击里。一边移动窗口。一边通知新页面运行ajax。

webview间相互传递消息使用webview的evalJS方法。
这样的做法,相当于用户是在show页面来等待联网数据。
预载入,尽管仅仅载入模板。但占用的内存资源较多。

假设是list转到content,事实上不同的item点击仅仅是一个页面,全然能够使用预载。

但假设页面不同且较多,后台预载太多webview还是会消耗不少系统资源,有可能在低配Android手机上不流畅。

(webview隐藏会减少内存占用。一般处于显示状态的webview不要超过3个)。
演示样例代码例如以下:

var webviewShow;
document.addEventListener('plusready', function(){ //扩展的js对象在plusready后方可使用webviewShow = plus.webview.create("show.html"); //后台创建一个webview。加载show.html文件
});
function clicklist (id) { //list点击item后的事件webviewShow.show("slide-in-right",300); //<span style="font-family: Arial, Helvetica, sans-serif;">把新webview窗口显示出来。显示动画效果为速度300毫秒的右側移入动画</span>
}

在HBuilder里新建一个移动App。构造好index里的list或button。把show页面准备好,把上述js代码复制进去,手机插上数据线连电脑,点HBuilder的真机执行,就可以看到效果。

- 2、现载,后台创建webview载入新页面完整内容。渲染后再显示到前台
假设认为内存消耗多。能够不预载页面。
当点击list页面的item时。首先绘出一个联网等待框,比方plus.nativeui里的原生waiting。
紧接着在后台create一个webview,加载show页面。
show页面在后台联网获取数据。

show页面在数据解析渲染后,再通过evalJS方法通知list页面关闭等待框,并运行窗口切换把show页面显示出来。
演示样例代码例如以下:

function clicklist (id) { //list点击item后的事件var nwaiting = plus.nativeUI.showWaiting();//显示原生等待框webviewShow = plus.webview.create("show.html");//后台创建webview并打开show.htmlwebviewShow.addEventListener("loaded", function() { //注冊新webview的加载完毕事件nwaiting.close(); //新webview的加载完毕后关闭等待框webviewShow.show("slide-in-right",300); //把新webview窗口显示出来,显示动画效果为速度300毫秒的右側移入动画}, false);
}

### 另一个须要注意的白屏问题。是启动后第一个页面的白屏。第一个页面是无法隐藏创建的。
假设第一个页面内容较大或联网,会出现启动封面图片消失后,页面还没渲染好。
此时须要手动控制封面图片消失。

首先在manifest.json里找到plus、splashscreen、autoclose节点,设置为false,即手动控制封面图片的消失。
然后在首页合适的位置,一般在联网并构造完新的dom时。调用js关闭封面图片,plus.navigator.closeSplashscreen();
这样就能防止第一个页面的白屏。

### 后记
无论使用哪种方法。都要注意一点,手机App的HTML页面必须本身性能足够高。

页面体积要小、载入和渲染要快。
互联网上有非常多提升HTML、JS、CSS、图片性能的方案。此处不再罗列。
但务必注意一点,尽量不要使用js框架。
pc上web框架的盛行。也是后来pc浏览器性能足够高之后的事情。互联网发展初期的开发人员并不像现在这般依赖框架。
手机,尤其是低端Android机的性能也非常差,假设照着写pc web的思路写页面,终于的用户体验必定会非常差。
首先。AMD框架不要想了,js动态解析标签再替换渲染根本来不及。
其次。jquery、zepto也尽量不要使用。

document.getElementById("") 、document.querySelectorAll("")、$(""),这三者性能依次下降。尤其是在低端Android上遍历dom时,当你辛辛苦苦降低白屏和用户等待时间时。你会很愤慨这些js框架拖了你的后腿。

转载于:https://www.cnblogs.com/mfrbuaa/p/5244264.html

[重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏相关推荐

  1. [重磅] 让HTML5达到原生的体验 系列之一 避免切页白屏

    很多人都想.甚至曾使用HTML5开发跨平台App,并且想达到原生App的体验. 最后的结果都是无奈的放弃,HTML5貌似美好,但坑太多,想做到原生App的体验几乎不可为. 也曾有过著名的faceboo ...

  2. 提升HTML5的性能体验系列之一 避免切页白屏

    提升HTML5的性能体验系列之一 避免切页白屏 白屏 切换页面 性能 转场 提升HTML5的性能体验系列文章目录导航: - [提升HTML5的性能体验系列之一 避免切页白屏] - 提升HTML5的性能 ...

  3. 提升html5的性能体验系列之一避免切页白屏

    窗体切换白屏的现实问题 HTML5的性能比原生差很多,比如切页时白屏.列表滚动不流畅.下拉刷新和上拉翻页卡顿. 在低端Android手机上,很多原生App常用的功能和体验效果都很难使用HTML5技术模 ...

  4. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3) 自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后, 就吸引了全球广大机器人爱好者的眼球 ...

  5. 白话经典算法系列之中的一个 冒泡排序的三种实现

    冒泡排序是很easy理解和实现,,以从小到大排序举例: 设数组长度为N. 1.比較相邻的前后二个数据,假设前面数据大于后面的数据,就将二个数据交换. 2.这样对数组的第0个数据到N-1个数据进行一次遍 ...

  6. 浅析云平台底层架构 进行云原生应用开发 系列课程-薛海涛-专题视频课程

    浅析云平台底层架构 进行云原生应用开发 系列课程-2892人已学习 课程介绍         如何依托Bluemix的PaaS服务,开发云原生应用,并深入的讲解cloudfoundry app生命周期 ...

  7. LINQ体验系列文章导航

    LINQ体验系列文章导航 LINQ推荐资源 推荐一个大家学习和交流LINQ的地方,就是博客园的LINQ专题和LINQ交流小组.LINQ专题中整理了有关LINQ方方面面的入门.进阶.深入的文章:学习中遇 ...

  8. 云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇

    ​作者:​智妍(郑妍).​浣碧(何颖)​ 什么是混沌工程,云原生大潮下的混沌工程特点 通过使用云计算厂商如阿里云.AWS 等提供的服务,现代服务提供者得以用更低廉的成本,更稳定地进行丰富的软件服务提供 ...

  9. 一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法

    一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法 参考文章: (1)一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法 (2)https://www.cnbl ...

最新文章

  1. 再见,PyTorch!
  2. Dialog、Toast、Snackbar,你真的了解它们吗?
  3. 项目感言--功能的模块化
  4. [浅谈 演示] 你所不知道的HTML - 从 XHTML2 到 HTML5 (1)
  5. SAP ERP系统之库存参数选择与优化
  6. ABAP--如何建立通过sap表维护工具来维护自定义表TCODE
  7. 2013年11月19日
  8. phpcms v9 sql数据{$r[content]},前端如何换行显示?
  9. DIY制作otto机器人
  10. 不知道不 OK!53 个 Python 经典面试题详解
  11. java项目ppt介绍_Java软件工程与项目案例教程ppt模板
  12. 《高性能mysql》之MySQL高级特性(第七章)
  13. 在win10系统中批量修改文件名称
  14. uniapp图片添加水印
  15. 【已解决】The server cannot or will not process the request due to something that is perceived to be ...
  16. Windows 10 下 TeXstudio 深色背景主题的设置方法
  17. 51单片机学习2——DS1302制作简易数码管电子时钟
  18. Simbec-Orion Group采用甲骨文电子临床云套件简化临床试验管理过程
  19. Thinkpad x60 Bios设置指南
  20. MFC判断文件或文件夹是否存在函数

热门文章

  1. 2022-2028年中国安防视频行业市场前景分析预测报告
  2. 2021-2027年中国中空纤维膜行业市场研究及前瞻分析报告
  3. 如何利用python的newspaper包快速爬取网页数据
  4. 难忘的一天——装操作系统(四)
  5. 【运维学习笔记】生命不息,搞事开始。。。
  6. LeetCode简单题之旅行终点站
  7. 参数服务器训练基本理论
  8. 深度学习-智能视频监控
  9. Cookie和Session的区别与联系
  10. ViewGroup的Touch事件分发(源码分析)