/* MUI 使用说明:
*
* 1.每个用到mui的页面都调用下mui.init。
* 2.如果需要使用大H5+对象,就写到plusReady中,如plus对象。
*/
'''【MUI开发注意事项】-----------------------------------------------------------------------------------
//1.【固定栏靠前】
所谓的固定栏:也就是带有.mui-bar属性的节点
(.mui-bar-nav)
(.mui-bar-footer)
(.mui-bar-tab)
这些元素使用时需遵循一个规则:放在.mui-content元素之前
//2.【一切内容都要包裹在mui-content中】
除了固定栏之外,其它内容都要包裹在.mui-content中
//3.【始终为button按钮添加type属性】
若button按钮没有type属性,浏览器默认按照type=submit逻辑处理,
这样若将没有type的button放在form表单中,点击按钮就会执行form表单提交,页面就会刷新,用户体验极差
//4.【窗口管理】
//4.1 页面初始化:必须执行mui.init方法
mui在页面初始化时,初始化了很多参数配置,比如:
按键监听、手势监听等,因此mui页面都必须调用一次mui.init()方法;
//4.2 页面跳转:抛弃href跳转
mui.openWindow方法打开一个新的webview,mui会自动监听新页面的loaded事件,
若加载完毕,再自动显示新页面;
//4.3 页面关闭:勿重复监听backbutton
则需要重写mui.back方法,切勿简单通过addEventListener添加backbutton监听,
因为addEventListener只会增加新的执行程序,mui默认封装的监听执行逻辑依然会继续执行,
因此若仅addEventListener添加用户确认框,则用户即使选择了取消,也会继续关闭窗口。
//5.【手势操作】
// 点击:忘记click
mui为了解决这个问题,封装了tap事件,因此在任何点击的时候,请忘记click及onclick操作,
统统使用如下代码:
element.addEventListener('tap',function(){
//点击响应逻辑
});
// 或者
mui.(#select).on("tap","li".funcation(){
//点击响应逻辑
});
//6.【常见错误 Uncaught ReferenceError: plus is not defined】
在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,
否则可能会报“plus is not defined”的错误;
mui为简化开发,将plusReady事件封装成了mui.plusReady()方法,
凡涉及到HTML5+的api,建议都写在mui.plusReady方法中;
'''【mui适用场景说明】-------------------------------------------------------------------------------------
为解决HTML5在低端Android机上的性能缺陷,mui引入了原生加速,其中最关键的就是webview控件,
因此mui若要发挥其全部能力,需和5+ App配合适用,若脱离5+ App,mui功能会受限,主要涉及三个部分:
详细参考:http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/113
'''【如何自定义mui控件样式】-------------------------------------------------------------------------------
参考:http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/87
'''【如何自定义icon图标】-------------------------------------------------------------------------------
//1. 选择图库:(以淘宝素材库为例)
淘宝: http://iconfont.cn/collections?spm=a313x.7781069.0.0.KmfS4h
ICO Moon: https://icomoon.io/app/#/select
Font Awesome: http://www.bootcss.com/p/font-awesome/
//2. 找到所需素材下载到本地(包含 css 和ttf文件)
//3. 修改 iconfont.css 文件中的 【@font-face】
保留所需的 ttf字体即可,如下:修改url增加相对路径 src:url('.../fonts/');
@font-face {font-family: "iconfont";
src:url('.../fonts/iconfont.ttf') format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
}
//4. 将 iconfont.css 拷贝到项目的fonts目录下,iconfont.ttf 拷贝到项目的css目录下。
//5. mui中使用:
// class :
// mui-icon :写死
// iconfont :自定义图片字体的类名
// icon-nanzhuang : 自定义的icon名字
'''【如何判断预加载是否生效】-------------------------------------------------------------------------------
1. 直观判断,预加载成功打开新页面很快不会有加载等待
2. log分析
'''【MUI_JavaScript 函数 http://dev.dcloud.net.cn/mui/util/】-------------------------------------------------------------------------------
【窗口管理】
//1.初始化MUI 和 准备 mui.init(); / mui.plusReady();
目前支持在mui.init方法中配置的功能包括:
创建子页面、关闭页面、手势事件配置、预加载、下拉刷新、上拉加载、设置系统状态栏背景颜色
代码案列:
mui.init({
//子页面
subpages: [{
url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址
id:your-subpage-id,//子页面标志
styles:{
top:subpage-top-position,//子页面顶部位置
bottom:subpage-bottom-position,//子页面底部位置
subpage-width,//子页面宽度,默认为100%
height:subpage-height,//子页面高度,默认为100%
......
},
extras:{}//额外扩展参数
}],
//预加载
preloadPages:[
{
url:prelaod-page-url,
id:preload-page-id,
styles:{},//窗口参数
extras:{},//自定义扩展参数
subpages:[{},{}]//预加载页面的子页面
}
],
//下拉刷新
pullRefresh : {
//...
},
//上拉加载
pullRefresh : {
//...
},
//手势配置
gestureConfig:{
//...
},
//侧滑关闭
swipeBack:true, //Boolean(默认false)启用右滑关闭功能
//监听Android手机的back、menu按键
keyEventBind: {
backbutton: false, //Boolean(默认truee)关闭back按键监听
menubutton: false //Boolean(默认true)关闭back按键监听
},
//处理窗口关闭前的业务
beforeback: function() {
//... //窗口关闭前处理其他业务详情点击 ↑ "关闭页面"链接查看
},
//设置状态栏颜色
statusBarBackground: '#9defbcg', //设置状态栏颜色,仅iOS可用
});
//在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用mui.plusReady();
// 2.打开新页面
mui.openWindow({
url:new-page-url,
id:new-page-id,
styles:{
top:newpage-top-position,//新页面顶部位置
bottom:newage-bottom-position,//新页面底部位置
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:{
waiting-dialog-widht,//等待框背景区域宽度,默认根据内容自动计算合适宽度
height:waiting-dialog-height,//等待框背景区域高度,默认根据内容自动计算合适高度
......
}
}
})
// 3.关闭页面
mui框架将窗口关闭功能封装在mui.back方法中,具体执行逻辑是:
若当前webview为预加载页面,则hide当前webview;
否则,close当前webview;
在mui框架中,有三种操作会触发页面关闭(执行mui.back方法):
// 使用参考(http://dev.dcloud.net.cn/mui/window/#openwindow)
1. 点击包含.mui-action-back类的控件
2. 在屏幕内,向右快速滑动
3. Android手机按下back按键
''''' 除了如上三种操作外,也可以直接调用mui.back()方法,执行窗口关闭逻辑;
// 4.预加载页面
方式一:通过mui.init方法中的preloadPages参数进行配置.
/*
优点:1.可预加载多个页面
缺点:1. 不会返回预加载每个页面的引用,
2.获得对应webview引用,plus.webview.getWebviewById方式获得
3.是异步执行,执行完mui.init方法后立即获得对应webview引用可能会失败
*/
mui.init({
preloadPages:[
{
url:prelaod-page-url,
id:preload-page-id,
styles:{},//窗口参数
extras:{},//自定义扩展参数
subpages:[{},{}]//预加载页面的子页面
}
],
preloadLimit:5//预加载窗口数量限制(一旦超出,先进先出)默认不限制
});
方式二:通过mui.preload方法预加载.// 可立即返回对应webview的引用,但一次仅能预加载一个页面
/*
优点:1.可立即返回对应webview的引用
缺点:1. 但一次仅能预加载一个页面
*/
var page = mui.preload({
url:new-page-url,
id:new-page-id,//默认使用当前页面的url作为id
styles:{},//窗口参数
extras:{}//自定义扩展参数
});
【事件管理】
// 1.事件绑定:addEventListener() / .on()
除了可以使用[【addEventListener()】方法监听某个特定元素上的事件外, 也可以使用【.on()】方法实现批量元素的事件绑定。
''''' 【 .on( event , selector , handler ) 】
event
Type: String
需监听的事件名称,例如:'tap'
selector
Type: String
选择器
handler
Type: Function( Event event )
事件触发时的回调函数,通过回调中的event参数可以获得事件详情
//2.事件取消:off()
''''' 【 .off( event , selector , handler ) 】
event
Type: String
需取消绑定的事件名称,例如:'tap'
selector
Type: String
选择器
handler
Type: Function
之前绑定到该元素上的事件函数,不支持匿名函数
''''' 【 .off( event , selector) 】
event
Type: String
需取消绑定的事件名称,例如:'tap'
selector
Type: String
选择器
''''' 【 .off( event ) 】
event
Type: String
需取消绑定的事件名称,例如:'tap'
''''' 【 .off( ) 】
空参数,删除该元素上所有事件
// 3. 事件触发 mui.trigger() 使用mui.trigger()方法可以动态触发特定DOM元素上的事件。
''''' 【.trigger( element , event , data )】
element
Type: Element
触发事件的DOM元素
event
Type: String
事件名字,例如:'tap'、'swipeleft'
data
Type: Object
需要传递给事件的业务参数
// 示例 自动触发按钮的点击事件:
var btn = document.getElementById("submit");
//监听点击事件
btn.addEventListener("tap",function () {
console.log("tap event trigger");
});
//触发submit按钮的点击事件
mui.trigger(btn,'tap');
//4. 手势事件
分类 参数 描述
----------------------------------------
| tap | 单击屏幕
点击 -------------------------------
| doubletap | 双击屏幕
----------------------------------------
| longtap | 长按屏幕
-------------------------------
长按 | hold | 按住屏幕
-------------------------------
| release | 离开屏幕
----------------------------------------
| swipeleft | 向左滑动
-------------------------------
| swiperight | 向右滑动
滑动 -------------------------------
| swipeup | 向上滑动
-------------------------------
| swipedown | 向下滑动
-----------------------------------------
| dragstart | 开始拖动
-------------------------------
| drag | 拖动中
拖动 -------------------------------
| dragend | 拖动结束
-----------------------------------------
使用:通过mui.init方法中的gestureConfig参数,配置具体需要监听的手势事
/**
注意:dragstart、drag、dragend共用drag开关,swipeleft、swiperight、swipeup、swipedown共用swipe开关*/
// 配置:
mui.init({
gestureConfig:{
tap: true, //默认为true
doubletap: true, //默认为false
longtap: true, //默认为false
swipe: true, //默认为true
drag: true, //默认为true
hold:false, //默认为false,不监听
release:false //默认为false,不监听
}
});
// 使用:
单个元素上的事件监听,直接使用addEventListener(0即可,如下:
elem.addEventListener("swipeleft",function(){
console.log("你正在向左滑动");
});
若多个元素执行相同逻辑,则建议使用事件绑定(on())。
*/
//5. 自定义事件:(页面传值)
5.1 添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,如下:
window.addEventListener('customEvent',function(event){
//通过event.detail可获得传递过来的参数内容
....
});
5.2 触发自定义事件,通过mui.fire()方法可触发目标窗口的自定义事件:
目标webview必须触发loaded事件后才能使用自定义事件
''''' 【 .fire( target , event , data ) 】
target
Type: WebviewObject
需传值的目标webview
event
Type: String
自定义事件名称
data
Type: JSON
json格式的数据
/** 实列:
【A.html】
1. 预加载B.html页面 preload()
mui.plusReady(function() {
var page = mui.preload({
url:'examples/zidingyi.html',
id:'zcmain'
});
});
2. 触发自定义事件
var webviews = plus.webview.getWebviewById("zcmain"); // 根据Id 获取B.html 的webview
alert("webviews = " + webviews);
mui.fire(webviews,'intents',{zcmains:'zhangchao'}); // 像B.html页面传递参数
mui.openWindow({ // 打开B.html
url:'examples/zidingyi.html',
id:'zcmain'
});
【B.html】
1. 监听自定义事件 获取去A.html 页面传递过来的数据
window.addEventListener('intents',function(event){
//获得事件参数
var id = event.detail.zcmains;
alert("id = " + id);
//根据id向服务器请求新闻详情
});
*
*/
【utils】
1. init(); // 初始化
创建子页面、关闭页面、手势事件配置、预加载、下拉刷新、上拉加载、设置系统状态栏背景颜色(仅支持ios)。
2. mui(); // mui使用css选择器获取HTML元素,返回mui对象数组。
mui("p"):选取所有元素
mui("p.title"):选取所有包含.title类的元素
mui("#loginbt"); 选取id为loginbt的元素
mui(".registerbt");选取class为registerbt的元素
//若要将mui对象转化成dom对象,可使用如下方法(类似jquery对象转成dom对象):
//obj1是mui对象 var obj1 = mui("#title");
//obj2是dom对象 var obj2 = obj1[0];
3. each() // 既是一个类方法,同时也是一个对象方法
mui.each( obj , handler ) obj Type: Array||JSONObj 需遍历的对象或数组;
若为对象,仅遍历对象根节点下的key handler Type: Function( Integer||String index,Anything element) 为每个元素执行的回调函数;其中,index表示当前元素的下标或key,element表示当前匹配元素
// each 遍历数组/json字符串 var array = [1,2,3];
// 数组 var str = {"name":"zcmain","age":"30","sex":"男"};
// json字符串 each_array.addEventListener('tap',function(){
// 遍历json字符串 mui.each(str,function(index,item){ log("index = " + index + "
item = " + item); });
// 遍历数组 mui.each(array,function(index,item){ log("index = " + index + "
item = " + item); }); });
4. scrollTo();
// 滑动(仅支付纵向) mui.scrollTo(500,1000,functioin(){});
// 500-华东距离;1000-执行动时间(毫秒);function-滑动结束回调函数
5. os
// 判断当前运行环境的需求, 使用: mui.os.XXX即可
// Android(可以访问的参数为:) .wechat 返回是否为微信端 .android 返回是否为安卓手机 .version 安卓版本号 .isBadAndroid android非Chrome环境
// iOS(可以访问的参数为:) .iOS 返回是否为苹果设备 .version 返回手机版本号 .iphone 返回是否为苹果手机 .ipad 返回是否为ipad
// plus(可以访问的参数为:) .plus 返回是否在基座中运行 .stream 返回是否为流应用 【Ajax】
// MUI封装Ajax函数 支持GET、POST请求方式,
// 支持返回json、xml、html、text、script数据类型 mui.ajax('http://server-name/login.php',{ data:{ // 发送到服务器的业务数据 username:'username', password:'password' },
/* dataType,预期服务器返回的数据类型,可选值如下: "xml": 返回XML文档 "html": 返回纯文本HTML信息; "script": 返回纯文本JavaScript代码 "json": 返回JSON数据 "text": 返回纯文本字符串 */ dataType:'json', type:'post',
//HTTP请求类型,目前仅支持'GET'和'POST',默认为'GET'方式 timeout:10000, //请求超时时间(毫秒),默认值为0,表示永不超时,如果超时会触发 error 回调。 success:function(data){ //服务器返回响应,根据响应结果,分析是否登录成功; ... },
error:function(xhr,type,errorThrown){ //异常处理; console.log(type); } });