mui-知識總結
阿新 • • 發佈:2018-12-14
mui-知識總結
- MUI + SDK 使用筆記:
- MUI是什麼:http://ask.dcloud.net.cn/article/91
- /* 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名字
- <span class=“mui-icon iconfont icon-nanzhuang”></span>
- ”‘【如何判斷預載入是否生效】——————————————————————————-
- 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,//子頁面底部位置
- width: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,//新頁面底部位置
- 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,//等待框背景區域高度,預設根據內容自動計算合適高度
- ……
- }
- }
- })
- // 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”):選取所有<p>元素
- mui(”p.title”):選取所有包含.title類的<p>元素
- 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 + “\nitem = ” + item);
- });
- // 遍歷陣列
- mui.each(array,function(index,item){
- log(”index = ” + index + “\nitem = ” + item);
- });
- });
- &nbs