mui初探笔记

/*  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); } });
原文地址:https://www.cnblogs.com/xzzzys/p/7919450.html