1. 程式人生 > >MUI框架開發HTML5手機APP(二)--頁面跳轉傳值&底部選項卡切換

MUI框架開發HTML5手機APP(二)--頁面跳轉傳值&底部選項卡切換

  概 述

JRedu

  在上一篇部落格中,我們學習瞭如何使用Hbuilder建立一個APP,同時如何使用MUI搭建屬於自己的第一款APP,沒有學習的同學可以戳連結學習: http://www.cnblogs.com/jerehedu/p/7832808.html  

  今天這篇部落格,我們繼續深入學習MUI框架,主要學習這幾個方面:載入子頁面、頁面跳轉並傳值,底部選項卡的多種實現方式。

一、MUI載入子頁面

1載入子頁面詳解

在mobile app開發過程中,經常遇到卡頭卡尾的頁面,也就是說頭部和尾部保持不動,而只有中間區域可以滾動,常見的就是新聞列表與詳情頁等情況:

如上圖所示,頭部和尾部不會跟著滾動,而是隻有中間列表區域正常滾動。但這種區域性滾動,在android手機上會出現滾動不流暢的問題;

針對這個問題,mui的解決思路是:將需要滾動的區域通過單獨的webview實現,完全使用原生滾動。也就是說,將頁面分為主頁面和子頁面兩部分,主頁面只有頭部和尾部,而需要滾動的區域放置到子頁面中,並在mui.init()方法中載入。大約就是這麼一個效果:

2載入子頁面的實現

在上篇部落格中,我們介紹了mui.init()方法,這個方法主要用於mui頁面的初始化,進行頁面載入時的各種配置,接受一個物件型別的引數。

那麼,在mui中載入子頁面非常簡單,只需要物件中傳入subpages屬性,用陣列格式表示多個頁面,subpages陣列的格式要求如下:

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:{}
//額外擴充套件引數 }] });

具體的實現步驟如下:

① 新建主頁面,只保留頭部和尾部

主頁面中輸入mHeader、mfooter即可快速生成頭尾

        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">在主頁面中載入子頁面</h1>
        </header>
        
        
        <nav class="mui-bar mui-bar-tab">
            <a class="mui-tab-item mui-active">
                <span class="mui-icon mui-icon-home"></span>
                <span class="mui-tab-label">首頁</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-phone"></span>
                <span class="mui-tab-label">電話</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-email"></span>
                <span class="mui-tab-label">郵件</span>
            </a>
            <a class="mui-tab-item">
                <span class="mui-icon mui-icon-gear"></span>
                <span class="mui-tab-label">設定</span>
            </a>
        </nav>

② 新建子頁面,承載一個列表頁

子頁面中輸入mList,即可快速生成一個列表頁面。注意子頁面中無需頭部尾部,也無需將內容包裹在mBody中。

        <ul class="mui-table-view">
            <li class="mui-table-view-cell">
                <a class="mui-navigate-right">
                    Item 1
                </a>
            </li>
            <li class="mui-table-view-cell">
                <a class="mui-navigate-right">
                     Item 2
                </a>
            </li>
            。。。。。。
        </ul>

③ 主頁面的mui.init()方法中載入子頁面

mui.init({
    /* 在頁面的指定位置,載入子頁面,實現卡頭卡尾的效果 */
    subpages:[{
      url:"0101-ziye.html",//子頁面HTML地址,支援本地地址和網路地址
      id:"0101-ziye.html",//子頁面標誌
      styles:{
        top:"45px",//子頁面頂部位置(頂部選項卡預設高度45px)
        bottom:"51px",//子頁面底部位置(頂部導航欄預設高度51px)
        //width:100%,//子頁面寬度,預設為100%
        //height:100%,//子頁面高度,預設為100%
      },
//    extras:{}//額外擴充套件引數,頁面傳值時使用
    }]
})

上述配置程式碼的詳細解釋已經在註釋中說明,大家按照註釋內容配置即可,其中extras:{}用於頁面間傳值使用,下個章節講解。

二、 頁面間跳轉並傳值

1頁面間跳轉傳值概述

在移動APP中,頁面之間的跳轉傳值是非常常用的,一種典型的應用就是從新聞列表頁點選每一條新聞,將新聞的id傳遞到詳情頁顯示,例如下述情況:

在這裡需要強調一下,雖然我們使用MUI製作的APP也是有網頁組成,但是頁面之間跳轉儘量不要使用超連結標籤<a></a>進行跳轉,MUI給我們提供了更加好用而且效能更優的方式:mui.openWindow(),這個函式我們在上篇部落格中已經使用過,此處不再贅述。

但是從效果圖可以看到,我們從列表頁跳轉到詳情頁時,標題上面的內容也在發生著變化,那麼我們就需要用到另一個函式:mui.openWindowWithTitle(),這個方法是對mui.openWindow()的擴充套件,支援nativeObj繪製標題欄,加快頁面展現。

2mui.openWindowWithTitle()介紹

這個函式是對mui.openWindow()的擴充套件,因此mui.openWindow()方法需要配置的引數,在這個方法中依然支援,同時這個方法要求傳入一個新物件,表示對標題欄的配置:

mui.openWindowWithTitle({
        // mui.openWindow()方法的各種配置項,依然寫在這裡
},{
    title:{//標題配置
        text:"",//標題文字
    },
    back:{//左上角返回箭頭
        image:{//圖片格式
            base64Data:''//載入圖片的Base64編碼格式資料 base64Data 和 imgSRC 必須指定一個.否則不顯示返回箭頭
        }
    }
})

3列表頁開啟詳情頁,並傳值

要實現頁面之間的跳轉傳值,首先要為列表頁的所有list新增點選事件,並獲取到每個list的id,同時將ID傳入到詳情頁。 當然,這些操作都需要在mui.plusReady方法中寫入:

mui.plusReady(function(){
    var arr = document.getElementsByTagName("a");
for(var i=0; i<arr.length; i++){
    !function(i){
        arr[i].addEventListener("tap",function(){
            mui.openWindowWithTitle({
                url:"0102-detail.html",
                id:"0102-detail.html",
                styles:{
                },
                extras:{
                    // 開啟頁面的同時,向新頁面傳遞資料。
                    newsId : i
                }
            },{
                //標題欄的背景色和底邊線配置
                backgroundColor:"#C9302C",
                //bottomBorderColor:"#00ff00",
                title:{
                    //標題文字的內容和樣式配置
                    text:"新聞詳情"+(i+1),
                    styles:{
                        color:"#FFFFFF",
                        align:"center",
                        family:"'Helvetica Neue',Helvetica,sans-serif",
                        size:"20px",
                        style:"normal",
                        weight:"bold",
                    }
                },
                back:{
                    image:{
                /*返回箭頭圖片可以使用imgSrc,也可以使用base64編碼*/
                        //imgSrc:"img/back.png"
                        base64Data:"data:image/png;base64,……"
                    }
                }
            })
        })
    }(i);
}
});    

這裡面,除了mui.openWindowWithTitle()之外,還有一個重要的程式碼:

extras:{
    // 開啟頁面的同時,向新頁面傳遞資料。
    newsId : i
}

這就是頁面之間傳值的關鍵所在,使用extras物件,將我們需要傳遞給新頁面的資料以鍵值對的形式送達。

4詳情頁接受列表頁傳值

當列表頁當id傳給詳情頁以後,詳情頁接受就很簡單了,只需要先取到當前詳情頁的WebView,並從當前WebView中取到傳過來的newsId:

mui.plusReady(function(){
    // 取到當前的webview
    //var slef = plus.webview.currentWebview();
    
    // 通過webview的id,獲取指定的webview
    var slef = plus.webview.getWebviewById("0102-detail.html");
    
    document.getElementById("num").innerText = slef.newsId+1;
})

上述程式碼可以看到,取到當前WebView的方式有兩種,一種是直接取到當前WebView,一種是使用WebView的id獲得指定的WebView。 不管哪種方式取到,拿到WebView以後,就可以直接以鍵取值。

三、底部選項卡切換頁面

底部選項卡的切換,可以說是APP的標誌之一。 幾乎主流的所有APP,都會在底部有多個選項卡,可以點選切換不同頁面。而這個功能,MUI也很友好的給我們提供了兩種方式:DIV模式和WebView模式。兩種模式的顯示效果差不多,如下圖可見:

1兩種模式的區別

顧名思義,DIV模式是將所有子頁面的內容,分別放置到主頁不同的DIV中,當我們點選主頁的不同選項卡時,切換不同DIV的顯示。 這種方式顯然要比載入子頁的方式快很多,但是也顯然不能承載很多佈局的頁面,畢竟要在一個主頁中寫入所有子頁面的程式碼,顯得不太現實。

而WebView模式則是將所有子頁面都寫入到不同的子頁面中,再通過主頁連線到一起,點選不同的選項卡 ,載入不同的子頁面,顯然這種方式更符合我們的預期和要求。

2底部選項卡切換(DIV模式)

DIV模式的選項卡切換非常的簡單,無需一行JS程式碼,直接使用HTML程式碼即可實現程式碼的切換:

        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">底部選項卡切換(Div模式)</h1>
        </header>
        
        <nav class="mui-bar mui-bar-tab">
            <a class="mui-tab-item mui-active" href="#page1">
                <span class="mui-icon mui-icon-home"></span>
                <span class="mui-tab-label">首頁</span>
            </a>
            <a class="mui-tab-item" href="#page2">
                <span class="mui-icon mui-icon-phone"></span>
                <span class="mui-tab-label">電話</span>
            </a>
            <a class="mui-tab-item" href="#page3">
                <span class="mui-icon mui-icon-email"></span>
                <span class="mui-tab-label">郵件</span>
            </a>
            <a class="mui-tab-item" href="#page4">
                <span class="mui-icon mui-icon-gear"></span>
                <span class="mui-tab-label">設定</span>
            </a>
        </nav>
        
        
        <div class="mui-content">
            <div id="page1" class="mui-control-content mui-active">
                這是第一個頁面
            </div>
            <div id="page2" class="mui-control-content">
                這是第二個頁面
            </div>
            <div id="page3" class="mui-control-content">
                這是第三個頁面
            </div>
            <div id="page4" class="mui-control-content">
                這是第四個頁面
            </div>
        </div>

程式碼解釋:

這種方式的實現,只需要給代表每個子頁面的div,新增mui-control-content類即可,同時用mui-active表示預設載入的第一個子頁。

寫好子頁DIV後,給每個div起一個id,並且將這個id與底部選項卡中的每個a標籤的href屬性相關聯,即可實現選項卡的切換。

3底部選項卡切換(WebView模式)

使用WebView模式的選項卡切換,首先需要建立多個子頁面的HTML檔案,而主頁中,只需要頭部和尾部即可,其他功能交給JS操作:

<header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title" id="title">首頁</h1>
        </header>
        
        <nav class="mui-bar mui-bar-tab">
            <a id="defaultTab" class="mui-tab-item mui-active" href="a.html">
                <span class="mui-icon mui-icon-home"></span>
                <span class="mui-tab-label">首頁</span>
            </a>
            <a class="mui-tab-item" href="b.html">
                <span class="mui-icon mui-icon-email"></span>
                <span class="mui-tab-label">訊息</span>
            </a>
            <a class="mui-tab-item" href="c.html">
                <span class="mui-icon mui-icon-contact"></span>
                <span class="mui-tab-label">通訊錄</span>
            </a>
            <a class="mui-tab-item" href="d.html">
                <span class="mui-icon mui-icon-gear"></span>
                <span class="mui-tab-label">設定</span>
            </a>
        </nav>

HTML程式碼的簡潔,必然造成JS程式碼的相對複雜,但是也很簡單,大家使用貼上複製大法即可:

        var subpages = ['a.html', 'b.html', 'c.html', 'd.html'];
        var subpage_style = {
            top: '45px',
            bottom: '51px'
        };
            
        var aniShow = {};
            
         //建立子頁面,首個選項卡頁面顯示,其它均隱藏;
        mui.plusReady(function() {
            var self = plus.webview.currentWebview();
            for (var i = 0; i < 4; i++) {
                var temp = {};
                var sub = plus.webview.create(subpages[i], subpages[i], subpage_style);
                if (i > 0) {
                    sub.hide();
                }
            /* 讓新建立的webview,追加合併到當前的視窗上。合併成一個視窗。
                * 目的:將父子視窗合併成一個頁面,實現同開同關的效果。 避免點選返回安監室,子頁面先關閉,而父頁面的頭部和尾部沒有關閉的BUG。
             */
                self.append(sub);
            }
        });
         //當前啟用選項
        var activeTab = subpages[0];
        var title = document.getElementById("title");
        //選項卡點選事件
        mui('.mui-bar-tab').on('tap', 'a', function(e) {
            var targetTab = this.getAttribute('href');
                
            if (targetTab == activeTab) {
                return;
            }
            //更換標題
            title.innerHTML = this.querySelector('.mui-tab-label').innerHTML;
            //顯示目標選項卡
            //若為iOS平臺或非首次顯示,則直接顯示
            if(mui.os.ios||aniShow[targetTab]){
                plus.webview.show(targetTab);
            }else{
                //否則,使用fade-in動畫,且儲存變數
                var temp = {};
                temp[targetTab] = "true";
                mui.extend(aniShow,temp);
                plus.webview.show(targetTab,"fade-in",300);
            }
            //隱藏當前;
            plus.webview.hide(activeTab);
            //更改當前活躍的選項卡
            activeTab = targetTab;
    });

每一行程式碼的詳細作用,均已在程式碼註釋中詳細說明 ,但是對於很多新手同學,可能理解起來依然存在一定的問題,所以貼心的傑小瑞老師準備了極大程度的簡化版本。

4底部選項卡切換(傑小瑞老師簡化版)

上面的程式碼雖然功能強大,但是程式碼雜亂,很不容易理解,我們可以在保留原來的HTML的基礎上,將JS程式碼進行極大程度的簡化處理:

mui.plusReady(function(){
    var pages = ["a.html","b.html","c.html","d.html"];
    var arr = document.getElementsByClassName("mui-tab-item")
    var styles = {
        top:"45px",
        bottom:"51px"
    }
    var pageArr = [];
    var slef = plus.webview.currentWebview();
    for(var i=0; i<arr.length; i++){
        // 有幾個選項卡,需要建立幾個子頁面
        var page = plus.webview.create(pages[i],pages[i],styles);
        pageArr.push(page);
        !function(i){
            arr[i].addEventListener("tap",function(){
                // 讓當前頁面(i)顯示,不是當前頁面隱藏
                for(var j=0; j<pageArr.length; j++){
                    if(j!=i) pageArr[j].hide();
                    else pageArr[j].show();
                }
                /* 讓新建立的webview,追加合併到當前的視窗上。合併成一個視窗。
                 * 目的:將父子視窗合併成一個頁面,實現同開同關的效果。 避免點選返回安監室,子頁面先關閉,而父頁面的頭部和尾部沒有關閉的BUG。
                 */
                slef.append(pageArr[i]);
            })
        }(i);
    }
    // 預設觸發第0個選項卡的tap事件。
    mui.trigger(arr[0],"tap");
});

怎麼樣,程式碼是不是簡潔很多了呢?一起來看看最終效果吧!!

  好了,今天的內容就先到這了,下篇部落格讓我們繼續探討MUI的更高階功能吧!由於部落格描述有限,使用過程中有任何問題,歡迎評論留言討論哦~~

  如果需要原始碼,請點選下載連結進行下載。

作者:傑瑞教育
出處: 
傑瑞教育技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
技術諮詢:JRedu技術交流

相關推薦

MUI框架開發HTML5手機APP()--頁面&底部選項切換

  概 述 JRedu   在上一篇部落格中,我們學習瞭如何使用Hbuilder建立一個APP,同時如何使用MUI搭建屬於自己的第一款APP,沒有學習的同學可以戳連結學習: http://www.cnblogs.com/jerehedu/p/7832808.html     今天這篇部落格,我們繼續深入學習

MUI框架開發HTML5手機APP(一)--搭建第一個手機APP

  前  言 JRedu  隨著HTML5的不斷髮展,移動開發成為主流趨勢!越來越多的公司開始選擇使用HTML5開發手機APP,而隨著手機硬體裝置配置的不斷提升,各種開發框架的不斷優化,也使著H5開發的混合APP的體驗越來越趨於原生!那麼在本系列部落格中,我們就來一探H5開發APP的神祕面紗吧~~

iOS開發(swift):頁面(續)

副標題:.xib檔案的介面與.storyboard的介面相互跳轉 一、.storyboard檔案的介面跳轉到.xib檔案的介面 0.回顧:沿用上一篇文章裡.storyboard的介面。現在要實現點選綠色介面(.storyboard)按鈕跳轉至新的藍色介面(.xib)。 1.下面

微信小程序——頁面

小程序 func data url ont bsp 需要 nav options 比如從index。wxml跳轉到aaa.wxml index.wml <navigator url="../aaa/aaa?id=1" > </navigator> 傳

UWP 頁面

nta avi prot navigate dto 控件 執行 received logs 如果涉及到頁面跳轉,一般用Frame這個控件來管理不同的頁面。 <Grid Name="RootGrid">    <Frame Name="RootFrame"

Vue + ElementUi 頁面的方法

element info vue 跳轉 body 9.png 分享圖片 nbsp .com       跳轉的頁面(接收):                跳轉的頁面(接收):    Vue + ElementUi 頁面跳轉傳值的方法

html頁面方法

本方法比較原始,不喜勿噴 //源頁面 Window.location.href="record.html?recId="+recId; 目標頁面 function getUrlParam (name) { var reg = new RegExp("(^|&)" +

vue中頁面的幾種方式

一、router-link URL路徑:http://localhost:8081/#/test?userid=1 <router-link :to="{path:'/test',query: {userid: id}}">跳轉</router

微信小程式實現頁面以及獲取的方法分析

本文例項講述了微信小程式實現頁面跳轉傳值以及獲取值的方法。分享給大家供大家參考,具體如下:在安卓中頁面跳轉傳值都是通過bundle,現在研究一下小程式的列表跳轉及頁面傳值。my.wxml<view class="container"> <view bind

頁面a到另一個頁面b,js實現頁面

要實現從一個頁面A跳到另一個頁面B,js實現就在A的js程式碼加跳轉程式碼 JS跳轉大概有以下幾種方式: 第一種:(跳轉到b.html)<script language="javascript" type="text/javascript">window.l

頁面,兩個頁面cookie

頁面之間傳值,cookie解決。很簡單很實用。 function wxShowAffirmWT(wtid){ document.cookie = "workTid="+workTid;//增加值對到

React-native頁面實現

首先是index.android.js 我們需要用到Navigator來進行頁面的跳轉,所有的js檔案處於同一目錄下面, 在FirstPageComponent頁面中我們需要定義好引數: constructor(props) { super(props);

asp.net頁面的幾種方式

protected void Button1_Click(object sender, EventArgs e) { //使用querystring傳值 //Response.Redirect("b.aspx

微信小程式(5)--頁面(點選item

one頁面實現以下程式碼: 1,data-id="{{item.id}}"為標記列表的下標, item.id的來源與wx:for="{{ components }}"的列表渲染 bindtap="re

微信小程式頁面以及獲取方法

在安卓中頁面跳轉傳值都是通過bundle,現在研究一下小程式的列表跳轉及頁面傳值。 my.wxml <view class="container"> <view bindt

Django-頁面問題

一、情景     eg:檢視一條資料的詳情,需要跳轉頁面,並進行傳值二、思路方式1:觸發詳情按鈕時,Js獲取到該條資料的id值,並傳遞給url,後臺接受到該請求,通過id查詢到這條資料。並返回一個json串給前端。前端拿到資料進行處理,對映給頁面。方式2:觸發詳情按鈕時,同時

JavaScript_頁面

方式一:用快取進行傳值 // 儲存值 localStorage.setItem("jsonData","jsonDataValue"); // 獲取值 localStorage.getItem("jso

js頁面

頁面跳轉傳值是通過在url連結裡面用“?”追加引數值,進行頁面之間傳參,程式碼如下。頁面一(onepage.html)<!DOCTYPE html><html><head><meta charset="UTF-8"><ti

Intent 頁面

傳送方: Intent intent = new Intent(); intent.putExtra("name", "諸葛亮"); intent.putExtra("age", 50); intent.putExtra("IQ", 200.0f); intent.setC

vue頁面

play win created table 詳情 seq color use ESS 第一種方式:例:消息列表頁跳轉: methods: {   goTo(){     this.$router.push({       name:‘/My/Info‘,