HTML5+plus, Hbuilder

HTML5+plus介绍

HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和性能。

Hbuilder介绍

HBuilder是DCloud数字天堂)推出的一款支持HTML5Web开发IDE. HBuilder的编写用到了JavaC、Web和Ruby。HBuilder本身主体是由Java编写。

快,是HBuilder的最大优势,通过完整的语法提示和代码输入法、代码块等,大幅提升HTMLjscss的开发效率。

Hbuilder中天然的集成了HTML5 Plus

创建一个移动app项目

选择mui项目, 这样就会自动导入mui的css和js

目录结构如下

常用方法

使用websocket

基于HTML语言, 那他天生就支持websocket

# 创建连接
var ws_server = new WebSocket("ws://192.168.1.1:9527");

有两种方式来使用创建的连接, 第一种方式就是像之前一样, 直接使用ws, 代用各种方法

但是在HTML5 plus中还提供了一种方法

官网链接

http://dev.dcloud.net.cn/mui/event/#customevent

因为app可能有多个页面, 不确定某个页面要使用websocket发送数据, 所以, 可以使用mui.fire触发一个自定义的事件, 这个事件就可以用作发送websocket数据

现在假设在index页面创建了websocket连接对象ws

document.addEventListener("send_music", function(data) {  # 接受一个参数, 这个参数中有触发事件时携带的数据
// console.log(JSON.stringify(data.detail)) // 拿到的是某个页面提交事件时携带的数据
ws_server.send(JSON.stringify(data.detail));
})

在main页面要使用ws发送数据

# 根据页面的id获取页面
var index = plus.webview.getWebviewById("HBuilder");  # 默认的index页面id默认为Hbuilder
mui.fire(index, "send_music", {    # 触发index页面send_music事件, 并传递参数
"to_user": toy._id,
"msg": window.get_music + content.data.music_path,
"from_user": JSON.parse(window.localStorage.getItem("user"))._id
})

这样在index就能帮助main发送websocket数据

页面的初始化

在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法,涉及到HTML5+的api,建议都写在mui.plusReady方法中。

mui.plusReady(function(){
console.log("当前页面URL:"+plus.webview.currentWebview().getURL());
});

mui插件初始化

mui.init()    mui插件初始化

DOM初始化就绪

mui.ready()    当DOM准备就绪时,指定一个函数来执行。

打开新的页面

app中会有多个页面, 如何打开一个新的页面

官方:

做web app,一个无法避开的问题就是转场动画;web是基于链接构建的,从一个页面点击链接跳转到另一个页面,如果通过有刷新的打开方式,用户要面对一个空白的页面等待;如果通过无刷新的方式,用Javascript移入DOM节点(常见的SPA解决方案),会碰到很高的性能挑战:DOM节点繁多,页面太大,转场动画不流畅甚至导致浏览器崩溃; mui的解决思路是:单webview只承载单个页面的dom,减少dom层级及页面大小;页面切换使用原生动画,将最耗性能的部分交给原生实现.

http://dev.dcloud.net.cn/mui/window/#openwindow
mui.openWindow({
url:new-page-url,
id:new-page-
id,
styles:{
top:newpage-top-position,//新页面顶部位置
bottom:newage-bottom-position,//新页面底部位置
width:newpage-width,//新页面宽度,默认为100%
height:newpage-height,//新页面高度,默认为100%
......
},
extras:{
.....//自定义扩展参数,可以用来处理页面间传值
},
createNew:false,//是否重复创建同样id的webview,默认为false:不重复创建,直接显示
show:{
autoShow:true,//页面loaded事件发生后自动显示,默认为true
aniShow:animationType,//页面显示动画,默认为”slide-in-right“;
duration:animationTime//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
},
waiting:{
autoShow:true,//自动显示等待框,默认为true
title:'正在加载...',//等待对话框上显示的提示内容
options:{
width:waiting-dialog-widht,//等待框背景区域宽度,默认根据内容自动计算合适宽度
height:waiting-dialog-height,//等待框背景区域高度,默认根据内容自动计算合适高度
......
}
}
})

创建子页面

在mobile app开发过程中,经常会出现共用的导航栏或者选项卡,每次打开页面都需要重新渲染,而且容易出现卡头卡尾的现象。并且此时若使用局部滚动,在android手机上会出现滚动不流畅的问题;

http://dev.dcloud.net.cn/mui/window/#subpage
mui.init({
subpages:[{
url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址
id:your-subpage-id,//子页面标志
styles:{
top:subpage-top-position,//子页面顶部位置
bottom:subpage-bottom-position,//子页面底部位置
width:subpage-width,//子页面宽度,默认为100%
height:subpage-height,//子页面高度,默认为100%
......
},
extras:{}//额外扩展参数
}]
});

发送ajax请求

http://dev.dcloud.net.cn/mui/ajax/

mui框架基于htm5plus的XMLHttpRequest,封装了常用的Ajax函数,支持GET、POST请求方式,支持返回json、xml、html、text、script数据类型; 本着极简的设计原则,mui提供了mui.ajax方法,并在mui.ajax方法基础上,进一步简化出最常用的mui.get()、mui.getJSON()、mui.post()三个方法。

直接使用ajax

mui.ajax('http://server-name/login.php',{
data:{
username:'username',
password:'password'
},
dataType:'json',//指定服务器返回json格式数据
type:'post',//HTTP请求类型
timeout:10000,//超时时间设置为10秒;
headers:{'Content-Type':'application/json'},
success:function(data){
//服务器返回响应,根据响应结果,分析是否登录成功;
...
},
error:function(xhr,type,errorThrown){
//异常处理;
console.log(type);
}
});

直接使用post

mui.post('http://server-name/login.php',{
username:'username',
password:'password'
},function(data){
//服务器返回响应,根据响应结果,分析是否登录成功;
...
},'json'  # 指定服务器返回的数据格式
);

ajax发送get请求

mui.get('http://server-name/list.php',{category:'news'},function(data){
//获得服务器响应
...
},'json'
);

页面间传递数据

mui.openWindow时可以使用extras:{}, 来传递参数, 那么在页面中如何接受传递过来的数据呢

mui.plusReady(function() {
var content = plus.webview.currentWebview()  # 获取当前页面所有的数据, extras会将数据放在这里面
// console.log(JSON.stringify(content))
})

app本地存储

cs架构的时候使用cookie存放一些数据, app中也可以进行类似的操作

window.localStorage.setItem("user", "xxx")    # 设置一个值
window.localStorage.getItem("user") # 获取值
window.localStorage.removeItem("user", "xxx) # 删除某一个
window.localStorage.clear() # 清空, 删除所有

HTML5 plus也提供了

http://www.html5plus.org/doc/zh_cn/storage.html
var foo = plus.storage.getLength();

常用方法

getLength: 获取应用存储区中保存的键值对的个数
getItem: 通过键(key)检索获取应用存储的值
setItem: 修改或添加键值(key-value)对数据到应用数据存储中
removeItem: 通过key值删除键值对存储的数据
clear: 清除应用所有的键值对存储数据
key: 获取键值对中指定索引值的key值

调用手机扬声器

http://www.html5plus.org/doc/zh_cn/audio.html#plus.audio.AudioPlayer

使用方法

先创建一个音频对象

var playerObj = plus.audio.createPlayer(path);

播放音频

playerObj.play(successCB, errorCB)
successCB # 音频播放完成的后的回调函数
errorCB # 音频播放失败的回调函数

常用方法

play: 开始播放音频
pause: 暂停播放音频
resume: 恢复播放音频
stop: 停止播放音频
seekTo: 跳到指定位置播放音频
getDuration: 获取音频流的总长度
getPosition: 获取音频流当前播放的位置
setRoute: 设置音频输出线路

事件

http://dev.dcloud.net.cn/mui/event/

事件绑定

当点击登录时触发事件login

document.getElementById('loginBtn').addEventListener('tap',function () {
mui.openWindow({
url: "login.html",
id: "login.html",
createNew: true
})
})

取消事件

off(event,selector,handle)适用于取消对应选择器上特定事件所执行的特定回调

//点击li时,执行foo_1函数
mui("#list").on("tap","li",foo_1);
//点击li时,执行foo_2函数
mui("#list").on("tap","li",foo_2); function foo_1(){
console.log("foo_1 execute");
} function foo_2(){
console.log("foo_2 execute");
}
//点击li时,不再执行foo_1函数,但会继续执行foo_2函数
mui("#list").off("tap","li",foo_1);

off(event,selector)适用于取消对应选择器上特定事件的所有回调

//点击li时,执行foo_1函数
mui("#list").on("tap","li",foo_1);
//点击li时,执行foo_2函数
mui("#list").on("tap","li",foo_2); function foo_1(){
console.log("foo_1 execute");
} function foo_2(){
console.log("foo_2 execute");
}
//点击li时,foo_2、foo_2两个函数均不再执行
mui("#list").off("tap","li");

off()适用于取消当前元素上绑定的所有事件回调

//点击li时,执行foo_1函数
mui("#list").on("tap","li",foo_1);
//双击li时,执行foo_4函数
mui("#list").on("doubletap","li",foo_4);
//点击p时,执行foo_3函数
mui("#list").on("tap","p",foo_3); function foo_1(){
console.log("foo_1 execute");
} function foo_3(){
console.log("foo_3 execute");
} function foo_4(){
console.log("foo_4 execute");
}
//点击li时,不再执行foo_1函数;点击p时,也不再执行foo_3函数;双击li时,也不再执行foo_4函数;
mui("#list").off();

自动触发某个事件

var btn = document.getElementById("submit");
//监听点击事件
btn.addEventListener("tap",function () {
console.log("tap event trigger");
});
//触发submit按钮的点击事件
mui.trigger(btn,'tap');

原生支持的手势

分类 参数 描述
点击 tap 单击屏幕
doubletap 双击屏幕
长按 longtap 长按屏幕
hold 按住屏幕
release 离开屏幕
滑动 swipeleft 向左滑动
swiperight 向右滑动
swipeup 向上滑动
swipedown 向下滑动
拖动 dragstart 开始拖动
drag 拖动中
dragend 拖动结束

二维码识别

创建Barcode对象

mui.plusReady(function() {
// scan = new plus.barcode.Barcode('bcid');  // 创建对象
// scan.onmarked = function(type,result){ // 这是扫码成功的回调函数, 参数解释:二维码的类型, 扫描的结果
})

常用方法

start: 开始条码识别
cancel: 结束条码识别
close: 关闭条码识别控件
setFlash: 是否开启闪光灯
setStyles: 设置Barcode扫码控件的配置参数

常用事件

onmarked: 条码识别成功事件
onerror: 条码识别错误事件

使用什么进行app开发的更多相关文章

  1. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  2. app开发外包注意事项,2017最新资讯

    我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...

  3. 前端移动App开发环境搭建

    移动App开发环境安装 一.环境安装准备软件 二.node的安装 像安装普通软件一样,安装对应版本的node软件,安装好之后就可以运行npm命令行,比如npm init .npm install -g ...

  4. 一个小白App开发需要了解的基本技术

    本文针对小白用户对App做一个简单的介绍,首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己的需求选择不同的App开发. 一 App有哪些形式 WebApp:简单来说,Web A ...

  5. 移动web app开发必备 - 异步队列 Deferred

    背景 移动web app开发,异步代码是时常的事,比如有常见的异步操作: Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe(原理类似) setTimeo ...

  6. 移动web app开发必备 - Deferred 源码分析

    姊妹篇  移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...

  7. html5 app开发,你知道多少?

    随着大量新生移动设备的兴起,改变了互联网的未来,html5技术为开发者提供了一个跨平台的移动app开发方案,并且该方案具有很好的扩展性和灵活性,但就国内使用html5开发app应用技术来讲,还是有欠缺 ...

  8. 选择App开发外包时,你该了解哪些法律常识?

    随着App需求的激增,选择App外包服务的客户也多了起来.然而客户和开发方对于其中的法律条款却不甚了解,导致在服务过程中,时常会发生一些分歧和纠纷,最终致使项目搁浅. 为了普及App外包的法律常识,移 ...

  9. phongap、APICloud、ionic等app开发平台你都知道吗?

    大众创业热,很多人都想在互联网大展拳脚,然而大部分人却是非技术背景.针对这个行业痛点,现在国内外涌现出众多APP开发工具,开发者只要有相关的HTML5.CSS和JavaScript知识,便可以轻松快速 ...

  10. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

随机推荐

  1. linux 设置git记住密码

    linux下: 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入: https://{username}:{password}@github.com 注 ...

  2. using log4net on my project within a self-hosted WCF application z

    Add reference to log4net.dll to our console service host project (our application entry point) Add t ...

  3. jQuery解决高度统一问题

    <div class="itemdl over"> <dl class="fl"> <dt><img src=&quo ...

  4. February 6 2017 Week 6 Monday

    There are no shortcuts to any place worth going. 任何值得去的地方,都没有捷径. Several years ago, I climbed the Hu ...

  5. Code First TPH、TPT、TPC与继承类

    一.Table Per Hierarchy (TPH,默认) 每个层次结构共用一个表,类的每一个属性都必须是可空的. 1.默认行为 只建立一个表,把基类和子类中的所有属性都映射为表中的列. 在这种处理 ...

  6. Linux汉化(Cent Os汉化)

    在腾讯云上购买了Cent Os7.1的云服务器,是英文版啊,有没有?对于我这种英文的渣渣啊,所以我要用中文版,我就是这么low,怎么着呢? Ok ,在汉化之前,先查看系统的语言环境, echo $LA ...

  7. LayIM项目之基础数据获取代码优化,Dapper取代ADO.NET

    前言 最近在开发LayIM融云版,也在进行项目重构,现在在看之前的代码,简直不敢直视.不过不知道以后看现在的代码是不是也是糟糕的一批.LayIM有个接口,一般接触过的开发人员都不会生疏,就是init接 ...

  8. ECMAScript6 Generator & async

    Generator Generator函数是一个状态机,执行后返回一个遍历器对象.调用遍历器对象的.next()函数获取下一个状态. Generator是一个普通的函数,函数内部使用yield关键字定 ...

  9. js 实现图片无限横向滚动效果

    门户网站好多都有产品无线滚动展现的效果: 测试demo1 -- 非无缝滚动(可以看出来从头开始的效果): css样式如下: .box{ width: 1000px; border: 1px solid ...

  10. 使用jQuery实现option的上移和下移

    基本思路:     上移:(1)获取当前选中的元素的索引值             (2)判断当前元素是否为第一个元素             (3)如果是,则不执行上移操作,如果不是,则则调用ins ...