非常多人都想、甚至曾使用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.html
webviewShow.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框架拖了你的后腿。

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

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

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

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

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

  3. hdu1465不easy系列之中的一个(错排)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/37512659 转载请注明出 ...

  4. 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求

    一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...

  5. CGI原理解析系列之中的一个----CGI怎样获取WEBserver数据

    //gcc get_post.c -o get_post.ums; #include <stdio.h> #include <stdlib.h> #include <un ...

  6. 《深入浅出pig系列之中的一个》pig-0.12.0-cdh5.1.2的安装与执行

    这里使用的版本号是cdh发行的pig-0.12.0-cdh5.1.2 下载地址点这里 1.Pig简单介绍: Pig是yahoo捐献给apache的一个项目.它是SQL-like语言.是在MapRedu ...

  7. Ajax系列之中的一个:ajax旧貌换新颜

    什么是ajax? 什么是Ajax? Ajax就是Asynchronous +JavaScript+XML.中文翻译为:异步的javascript与XML,它是利用javascript语言和xml数据实 ...

  8. RxJava系列之中的一个 初识Rxjava

    1.简单介绍 基础知识 响应式代码的基本组成部分是Observables和Subscribers(事实上Observer才是最小的构建块,但实践中使用最多的是Subscriber.由于Subscrib ...

  9. AWR系列之中的一个——AWR简单介绍

    AWR的全称是Automatic Workload Repository(自己主动负载知识库). 它是通过对照两次快照的方式收集到统计信息.来生成txt或者html页面形式的报告. 通常,通过AWR报 ...

随机推荐

  1. Enabling Active Directory Authentication for VMWare Server running on Linux《转载》

    Enabling Active Directory Authentication for VMWare Server running on Linux Version 0.2 - Adam Breid ...

  2. 使用VTemplate模板引擎动态生成订单流程图

    1.VTemplate模板引擎的简介 VTemplate模板引擎也简称为VT,是基于.NET的模板引擎,它允许任何人使用简单的类似HTML语法的模板语言来引用.NET里定义的对象.当VTemplate ...

  3. Docker中的一些命令

    可以交互的方式启动container $ sudo docker run -t -i ubuntu:14.04 /bin/bash 当这个Bash shell进程终止时,这个容器也停止了. docke ...

  4. 除去内容中的HTML代码方法

    显示内容时,需要截取部分,而不要全部显示.在截取时,会出现这样的情况: 截取一定量的字符串后,可能会把未关闭的表格HTML代码留下来,最終导致界面受影响, 下面的是C#解决办法: public str ...

  5. ASP.NET优化性能方法之一禁用调试模式(转)

    若要设置 ASP.NET 应用程序的调试模式,必须编辑应用程序的 Web.config 配置文件. 通常,ASP.NET 应用程序的 Web.config 文件与应用程序位于相同的 URL 位置上. ...

  6. 使用kindeditor 注意

    ValidateRequest="false"引用编辑器要在最上端加入上面的话

  7. C#图像处理(3):在图像上加条形码

    引入Aspose.BarCode用来生成条形码,方法如下: /// <summary> /// 生成条码 /// </summary> /// <param name=& ...

  8. 多种下载文件方式 Response.BinaryWrite(byte[] DocContent);Response.WriteFile(System.IO.FileInfo DownloadFile .FullName);Response.Write(string html2Excel);

    通过html给xls赋值,并下载xls文件 一.this.Response.Write(sw.ToString());System.IO.StringWriter sw = new System.IO ...

  9. 【2】最简单的Laravel5.1程序分析

    1.上图!说一下laravel的基本MVC(模型-控制器-视图)原理 2.具体分析 用户输入网址localhost:8888之后,首先请求发送到服务器的laravel应用的public目录下index ...

  10. 列表:一个打了激素的数组2 - 零基础入门学习Python011

    列表:一个打了激素的数组2 让编程改变世界 Change the world by program 从列表中获取元素 跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索 ...