当前位置: 首页 > 编程日记 > 正文

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

非常多人都想、甚至曾使用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

相关文章:

测试中如何管理外包质量_如何从测试自动化中实现价值

如果几年前&#xff0c;质量管理部门都试图通过ROI指标来证明对测试的投资是合理的&#xff0c;那么现在情况发生了变化&#xff0c;是时候重新审视这个问题了。当实施连续测试&#xff0c;并且每天在不同的环境下以不同的角色运行多次测试自动化时&#xff0c;由于测量方法与以…

2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国碘矿行业市场行业相关概述、中国碘矿行业市场行业运行环境、分析了中国碘矿行业市场行业的…

centos下axel安装与使用

一、获得Axel32位系统&#xff1a;wget -c http://www.centoscn.com/tool/axel-2.4-1.el5.rf.i386.rpm rpm -ivh axel-2.4-1.el5.rf.i386.rpm #安装64位系统&#xff1a;wget -c http://www.centoscn.com/tool/axel-2.4-1.el5.rf.x86_64.rpm rpm -ivh axel-2.4-1.el5.rf.x86_64…

Qt编译PX4源码,参考如下进行配置

参考链接&#xff1a; https://blog.csdn.net/qq_38768959/article/details/106822491如单独打开一个的话可以选择打开仿真编译套件&#xff0c;如需下载则选择下载套件&#xff01;

Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS

本课程采用现代游戏开发(Unity 2021)的最新内容和最新技术 学习任何东西的最好方法是以一种真正有趣的方式去做&#xff0c;这就是这门课程的来源。如果你想了解你看到的这些不可思议的游戏是如何制作的&#xff0c;没有比这门课更好的起点了。我们确保本课程具备一切你需要的…

Integer.toHexString(b & 0xff)理解以及& 0xff什么意思

首先toHexString传的参数应该是int类型32位,此处传的是byte类型8位,所以前面需要补24个0。然后& 0xff 就是把前面24个0去掉只要后8位。toHexString(b & 0xff)相当于做了一次位的与运算,将前24位字符省略,将后8位保留。是两个十六进制的数,每个f用二进制表示是1111,所以占四位(bit),两个f()占八位(bit),八位(bit)也就是一个字节(byte).这个方法是把字节(转换成了int)以16进制的方式显示。我的理解是这样,如有不对欢迎指正!

DIV+CSS规范命名大全集合

网页制作中规范使用DIVCSS命名规则&#xff0c;可以改善优化功效特别是团队合作时候可以提供合作制作效率&#xff0c;具体DIV CSS命名规则CSS命名大全内容篇。 常用DIVCSS命名大全集合&#xff0c;即CSS命名规则 DIV CSS命名目录命名规则说明重要CSS命名CSS命名参考表命名技巧…

Java中的位运算符号详解(&、|、^、~、<<、>>、>>>)

(&&)在运算时,如果(&&)前面的表达式的结果为false,则(&&)后面的表达式就不会执行运算。(||)在运算时,如果(||)前面的表达式的结果为true,则(||)后面的表达式就不会执行运算。(&)在运算时,不论(&)前面的表达式的结果是否为false,(&)后面的表达式都会执行运算;(|)在运算时,不论(|)前面的表达式的结果是否为true,(|)后面的表达式都会执行运算;在Java中,(&)不仅可以作为位运算符号,同样也可以作为逻辑与符号,要注意:(||)并不是位运算符号,不可以参与位运算!

unity 200.8m yoy_专场分享会|大会最新Unity、中创文旅专场预告来啦!

北京国际游戏创新大会将于9月25日-27日分别在中华世纪坛发布厅、中华世纪坛剧场、京都信苑国际厅、京都信苑欧式厅、京都信苑圣马可厅、京都信苑第三会议室&#xff0c;6大场馆举办129场游戏行业主题分享&#xff0c;之前小编已经给大家介绍过腾讯、微软、完美世界、巨量引擎等…

2022-2028年中国碲化镉薄膜太阳能电池行业发展现状分析及投资前景趋势报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国碲化镉薄膜太阳能电池行业市场行业相关概述、中国碲化镉薄膜太阳能电池行业市场行业运行环…

从高耦合到低耦合到底有多远?

一切都是拥抱变化&#xff0c;反过来说&#xff0c;如果没有变化或者需求很稳定&#xff0c;那么一切就是过度设计。所以&#xff0c;一切都要看情况&#xff0c;回到了马克思主义的辩证学。呵呵。无论书还是博客&#xff0c; 耦合这个词已被无数人说烂&#xff0c;任何一位程序…

写论文查论文查参考文献

知网翻译助手&#xff1a;网页知网翻译助手 百度学术&#xff1a;百度学术—导出参考文献 IEEE&#xff1a;IEEE 添加上标&#xff1a;如下图 添加后&#xff0c;如下图&#xff1a; 添加完成&#xff01; WPS软件里面的公式编辑器添加空格为CtrlAltSpace即可&#xff01; …

C# Unity编程终极指南

使用现代Unity开发技术创建一个有趣的2D平台&#xff0c;掌握Unity引擎和C#编程 你会学到: 学习C#的基础知识。从变量、“如果”语句到创建面向对象的结构。没有编程经验是必要的。 创建一个可玩的角色(征服者)&#xff0c;具有动画&#xff0c;向任何方向移动&#xff0c;跳跃…

咪咕盒子链接服务器失败_云服务器怎样备份数据库备份

云服务器怎样备份数据库备份&#xff1f;云服务器数据库的备份很重要&#xff0c;而手动操作会比较麻烦。以西部数码云服务器为例&#xff0c;可以实现 Ms Sqlserver数据库定时自动备份&#xff0c;并存至指定存储空间。打开链接 下载&#xff0c;下载后无需安装&#xff0c;点…

在Ubuntu下构建Bullet以及执行Bullet的样例程序

在Ubuntu下构建Bullet以及执行Bullet的样例程序1、找到Bullet的下载页&#xff0c;地址是&#xff1a;https://code.google.com/p/bullet/downloads/list2、下载Bullet。找到.tgz格式进行下载。我下载的版本号是bullet-2.82-r2704。 3、假设没有安装cmake&#xff0c;那么使用s…

2022-2028年中国第五代移动通信技术(5G)市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国第五代移动通信技术&#xff08;5G&#xff09;行业市场行业相关概述、中国第五代移动通信…

机房合作—我是组长

五一期间开始机房合作&#xff0c;到现在一个多星期了。我&#xff0c;蕾蕾&#xff0c;亮亮一组&#xff0c;我担任组长一职。在着手准备项目开始之前&#xff0c;我们听取了各位师父的一些建议&#xff0c;也算是给我们指明一下方向。第一天晚上&#xff0c;我召开了我们项目…

Linux环境下命令行截图【转】

参考链接&#xff1a;命令行截图 将剪切板内容粘贴出来&#xff1a;CtrlV

用Unity和Playmaker创建一个限时游戏 Creating a Time Limit game with Unity and Playmaker

本课程结束时&#xff0c;您将拥有在Unity中使用Playmaker创建游戏的工具 你会学到: playmaker状态的基础以及它们如何与动作一起工作。 安装悬停车&#xff0c;可以在竞技场内行驶。 不同力度的射击地雷驱动中心机。 设置坏地雷和电源盒。 设置主时光机机制。 影响时间机器的…

app.vue 跳转页面_独立站如何提高产品页面转化呢?

在网上商城中&#xff0c;你的产品页面也是销售页面。顾客进入产品页面&#xff0c;然后根据你提供的产品描述内容&#xff0c;再决定是否立马购买&#xff0c;或者以后再考虑购买。以下是小跨收集的可以用于提高你独立站产品描述页面转化的几个要素。1.撰写激动人心的产品标题…

原生javascript实现放大镜效果

2019独角兽企业重金招聘Python工程师标准>>> html部分&#xff1a; <div class"main"><div id"xiaotu" class"xiaotu"><img src"http://zhangyan520.com/1.jpg" alt"" /><div id"yido…

新建个人博客参考

各种配置过程&#xff1a;新建参考 如果输入链接&#xff0c;出现如下截图&#xff0c;参考&#xff1a;报错404

C4D+ PS打造城市场景 Create a Cityscape with Cinema 4D + Photoshop

初级到中级课程&#xff0c;包括创建真实的城市景观可视化的步骤 你会学到: 建筑三维建模所涉及的创造性和技术性步骤。 使用变形器和MoGraph克隆器创建建筑变体&#xff0c;以更改每个建筑的形状。 创建城市街区&#xff0c;添加环境和提高中央处理器性能的技巧。 使用Adobe …

抽象工厂————三层架构

抽象工厂作用:降低BLL和Model层耦合度 核心思想:1.通过接口类实现对象的分离 2.通过一个类&#xff0c;实现指定对象的创建&#xff0c;并且这个类通过配置文件决定获取哪个对象 这样只要调用一个接口和这个类&#xff0c;就能实现BLL和Model的分离 这样做的优点是便于维护和…

jQuery 一次定时器_干货 | 小论定时器玩法(时间轮询法)

EEWORLD电子资讯 犀利解读 技术干货 每日更新经常来说&#xff0c;对于一些不复杂的单片机应用&#xff0c;而且对于内存和存储要求比较严格&#xff0c;又需要多分时去处理一些指定的任务&#xff0c;在无法使用RTOS的情况下&#xff0c;使用一个硬件定时器&#xff0c;来建立…

第一次团队冲刺2

今天在自己电脑上搭建了webservice&#xff0c;学习了很多关于webservice的知识&#xff0c;但还有很多不懂的。 还没有做好连接&#xff0c;其他的如查询等也没做。转载于:https://www.cnblogs.com/318abc/p/4504085.html

基于四元数互补滤波的无人机姿态解算

导航坐标系为东北天&#xff08;ENU&#xff09;&#xff0c;其与机体坐标系&#xff08;b&#xff09;的方向余弦矩阵为CbcC_{b}^{c}Cbc​

Unity粒子系统创建VFX游戏特效学习教程 Visual Effects in Unity Particle Systems [Beginner’s Guide]

在Unity中学习高级粒子系统和视觉效果创建。初级到中级 你会学到: 游戏的视觉效果 Unity粒子系统 Unity中的Vfx 创建Unity视觉效果的初级到中级指南 课程获取&#xff1a;Unity粒子系统创建VFX游戏特效学习教程-云桥网 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xf…

gulp 配置自动化前端开发

有的人说&#xff0c;grunt已经廉颇老矣&#xff0c;尚能饭否。gulp已经成为了未来的趋势&#xff0c;或许将撼动grunt的地位。 那么就得看看gulp到底优势在哪里&#xff0c;在我最近的使用中发现&#xff0c;我的到了一个结论&#xff1a;“grunt廉颇老矣...”。 gulp是基于流…

iphone相册怎么加密_iphone相册加密码锁,保护隐私

在以往很多使用iphone的小伙伴都会遇到一个难题&#xff0c;在不越狱的情况下进行给相册进行设置密码锁&#xff0c;这是一个无法完成的目标&#xff0c;在前几期也为大家分享了相册照片加密方法&#xff0c;但是用起来很是不方便&#xff0c;今天就为大家分享利用时间限额达到…