2020年10月9日 星期五

jQuery Mobile 學習筆記 (五) : 列表清單 (ListView)

本篇繼續測試 jQuery Mobile 的列表清單 (Listview). 本系列之前的文章參考 :

jQuery Mobile 學習筆記 (三) : 工具列
jQuery Mobile 學習筆記 (四) : 對話框

參考書籍 :
  1. jQuery Mobile 智慧型手機程式開發 (博碩, 岡本隆史)
  2. HTML5+CSS3+jQuery Mobile 輕鬆打造 App 與行動網站 (博碩, 陳婉凌)
  3. PhoneGap 跨平台手機程式開發實戰 (上奇, 張亞飛)
  4. 徹底研究 jQuery Mobile + PHP 手機程式及網站開發 (上奇, 張亞飛)
  5. jQuery Mobile 跨平台開發寶典 (上奇, 陶國榮)
  6. PHP+MySQL+jQuery Mobile 跨行動裝置網站開發 (碁峰, 陳會安)
  7. Visual Studio 2015 X Cordova跨平台App實戰特訓班 (碁峰, 文淵閣工作室)
  8. Javascript + jQuery Mobile + Node.js 跨平台網頁設計範例教本 (碁峰, 陳會安) 
  9. 錢沾計畫啟動:jQuery Mobile 跨平台賺錢 App 錢途無量 (佳魁, 李科泉) 
Listview 是一個很有用的使用者介面控制項, 通常當作一覽表用, 例如商品品項, 搜尋結果, 信箱收件夾, 頭條新聞列表等等. 參考 :

https://demos.jquerymobile.com/1.4.5/listview/

Listview 的網頁結構基本上有兩種, 一是使用具有 data-role="listview" 屬性的無序清單, 此方式項目的前面不會有序號 :

<ul data-role="listview">
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ul>

二是使用有序清單, 這種方式的項目前面會有序號 :

<ol data-role="listview">
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</ol>

例如 :


測試 1 : 放在 content 內的靜態 listview (有 data-inset 屬性) [看原始碼]

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>HTML5</li>
          <li>CSS3</li>
          <li>Javascript</li>
          <li>jQuery</li>
          <li>jQuery Moile</li>
        </ul>
        <ol data-role="listview" data-inset="true">
          <li>HTML5</li>
          <li>CSS3</li>
          <li>Javascript</li>
          <li>jQuery</li>
          <li>jQuery Moile</li>
        </ol>
        <a href="#" data-role="button">確定</a>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在內容區放了兩個 Listview (無序與有序) 以及一個按鈕, 注意, 每一個清單 ul/ol 元素都添加了 data-inset="true" 屬性, 這樣會讓 Listview 內縮且邊框具有圓角, 結果如下 :




上面的是用 ul-li 做的無序列表選單, 下面有序號的則是用 ol-li 做的有序列表選單, 可見 jQuery Mobile 會將 ul-li 或 ol-li 繪製成類似控制群組一樣的列表. 此例網址的 QR code 如下 :


注意, ul/ol 中的 data-inset="true" 是必要的, 如果拿掉的話會讓版面亂掉, 例如 :




<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview">
          <li>HTML5</li>
          <li>CSS3</li>
          <li>Javascript</li>
          <li>jQuery</li>
          <li>jQuery Moile</li>
        </ul>
        <ol data-role="listview">
          <li>HTML5</li>
          <li>CSS3</li>
          <li>Javascript</li>
          <li>jQuery</li>
          <li>jQuery Moile</li>
        </ol>
        <a href="#" data-role="button">確定</a>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例 ul/ol 仍在 content 內容區, 但去除了 data-inset="true" 屬性, 結果如下 : 




與上面有 data-inset="true" 時比較, 列表清單佔據了整個螢幕寬度 (沒有間隙), 且版面有點亂掉, 第二個列表清單與底下的按鈕的位置都稍微往上挪導致部分重疊, 據說這是 jQuery Mobile 的 Bug. 此例網址 QR code 如下 : 



有些書籍 (例如上面參考書 No.1 與 No.9) 建議 ul 與 ol 不需要用 div 或 article 元素包覆, 直接取代 content 的位置, 此作法列表清單將如上面測試 2 一樣佔據整個螢幕寬度, 沒有邊框與間隙, 但不會有版面亂掉的問題, 例如 : 


測試 3 : 沒有放在 content 內的靜態 listview [看原始碼]

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <ul data-role="listview">
        <li>HTML5</li>
        <li>CSS3</li>
        <li>Javascript</li>
        <li>jQuery</li>
        <li>jQuery Moile</li>
      </ul>
      <ol data-role="listview">
        <li>HTML5</li>
        <li>CSS3</li>
        <li>Javascript</li>
        <li>jQuery</li>
        <li>jQuery Moile</li>
      </ol>
      <a href="#" data-role="button">確定</a>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例 ul 與 ol 直接放在 header 與 footer 中間, 外面沒有用 div 或 article 元素包覆, 結果如下 :




可見沒有 content 包覆的話後間隙不見了, 但是卻沒有版面亂掉的問題. 因此如果列表清單需要佔據整個螢幕寬度可採用此方法, 此例網址的 QR code 如下 :




列表清單的項目內容除了純文字外, 也可以是 HTML 元素, jQuery Mobile 會將這些內容以不同效果繪製 :


 項目內容 用途
 a 互動清單
 h1~h6 粗體標題文字
 p 細體子標題文字
 span 計數氣泡
 img 圖示或縮圖


項目內容如果是超連結 a 元素, jQuery Mobile 會將其繪製為超連結按鈕, 使得列表清單具有互動性, 可用做內容區的導覽列, 用來載入其他頁面或連結到其他網頁, 而上面兩個範例只能靜態地顯示資訊 (read only) 而已. 互動式 Listview 預設會在右邊出現一個 > 符號, 例如 :


測試 4 : 項目內容是超連結的動態 listview (連結外部網頁) [看原始碼]

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li><a href="https://shopping.pchome.com.tw/">PChome 購物</a></li>
          <li><a href="https://tw.buy.yahoo.com/">Yahoo 購物</a></li>
          <li><a href="https://www.momoshop.com.tw/">momo 購物</a></li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例 Listview 中每一個項目內容都是連結到外部網站的超連結 a 元素, 結果如下 :




可見互動的列表清單每個項目右邊會有一個圖示 (預設是大於), 點按各項目會連結到超連結 href 屬性所指的購物網站. 此例網址 QR code 如下 : 



互動的 Listview 也可以用來載入其它頁面, 例如 : 

 

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page" id="page1">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview">
          <li><a href="#page2">第二頁</a></li>
          <li><a href="#page3">第三頁</a></li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
    <!-- 第二頁頁面 -->
    <section data-role="page" id="page2">
      <header data-role="header" data-add-back-btn="true" data-back-btn-text="返回">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <p>第二頁內容</p>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
    <!-- 第三頁頁面 -->
    <section data-role="page" id="page3">
      <header data-role="header" data-add-back-btn="true" data-back-btn-text="返回">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <p>第三頁內容</p>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例有三個頁面, 透過互動的 Listview 可進行換頁, 結果如下 : 






此例網址 QR code 如下 : 


接續上面測試 4, 互動 Listview 預設項目圖示為大於, 可以透過在 li 元素上添加 data-icon 屬性個別指定圖示, 關於圖示名稱參考 :


例如 :



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li data-icon="star"><a href="https://shopping.pchome.com.tw/">PChome 購物</a></li>
          <li data-icon="alert"><a href="https://tw.buy.yahoo.com/">Yahoo 購物</a></li>
          <li data-icon="plus"><a href="https://www.momoshop.com.tw/">momo 購物</a></li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在測試 4 範例的每個 li 中添加 data-icon 屬性指定圖示, 結果如下 : 




可見列表清單項目右方的圖示都改成指定之圖示了, 此例網址 QR code 如下 : 


如果項目種類繁多需做分類, jQuery Mobile 提供了 data-role="list-divider" 屬性可在 li 項目中插入分類標籤 : 

<li data-role="list-divider">分類標籤名稱</li>

例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li data-role="list-divider">購物</li>
          <li><a href="https://shopping.pchome.com.tw/">PChome 購物</a></li>
          <li><a href="https://tw.buy.yahoo.com/">Yahoo 購物</a></li>
          <li><a href="https://www.momoshop.com.tw/">momo 購物</a></li>
          <li data-role="list-divider">拍賣</li>
          <li><a href="https://www.ruten.com.tw/">露天拍賣</a></li>
          <li><a href="https://tw.bid.yahoo.com/">Yahoo 拍賣</a></li>
          <li><a href="https://shopee.tw/">蝦皮拍賣</a></li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在購物與拍賣兩類網站項目最前面插入具有 data-role="list-divider" 的 li 項目做為分類標籤 (只是作為單純的分類標籤, 因此不需套上超連結), 結果如下 : 




可見使用 data-role="list-divider" 可使項目之分類更清楚, 此例網址 QR code 如下 :


項目的內容可以用 h1~h6 來作為標題 (粗體), 使用 p 作為描述 (細體), 架構如下 :

<ul data-role="listview">
  <li>
    <h1>標題1</h1>
    <p>敘述1</p>
  </li>
  <li>
    <h1>標題2</h1>
    <p>敘述2</p>
  </li>
</ul>

例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>
            <h1>jQuery</h1>
            <p>可方便操作 DOM 的 Javascript 函式庫</p>
          </li>
          <li>
            <h1>jQuery Mobile</h1>
            <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
          </li>
          <li>
            <h1>Cordova</h1>
            <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例分別以 h1 與 p 來包覆標題與敘述文字, 注意, 使用 h1~h6 任一種均可, jQuery Mobile 繪製的標題大小不管用哪一個都一樣, 結果如下 : 




這樣就能強調主題與敘述的重要性分別了, 此例網址 QR code 如下 :


除了用 h1~h6 與 p 元素來區分標題與敘述外, 還可以使用具有 class="ui-li-aside" 屬性的 span 元素放在標題的後面做為輔助說明, 由於 span 元素是 in-line (非區塊) 元素, 因此這個 span 所包覆的內容會顯示在清單項目標題後面且向右對齊, 結構如下 : 

<ul data-role="listview">
  <li>
    <h1>標題1</h1>
    <span class="ui-li-aside">輔助說明1</span>
    <p>敘述1</p>
  </li>
  <li>
    <h1>標題2</h1>
    <span class="ui-li-aside">輔助說明2</span>
    <p>敘述2</p>
  </li>
</ul>

例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>
            <h1>jQuery</h1>
            <span class="ui-li-aside">最新 v3.5.1</span>
            <p>可方便操作 DOM 的 Javascript 函式庫</p>
          </li>
          <li>
            <h1>jQuery Mobile</h1>
            <span class="ui-li-aside">最新 v1.4.5</span>
            <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
          </li>
          <li>
            <h1>Cordova</h1>
            <span class="ui-li-aside">最新 v9.0.0</span>
            <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在 h1 後面添加具有 class="ui-li-aside" 屬性之 span 元素作為標題的輔助說明 (此處為函式庫最新版本訊息), 結果如下 : 




此例網址 QR code 如下 :



如果將上面測試 9 的項目內容都用超連結 a 元素包覆就變成互動式 Listview, 點按各清單選項可載入官方網頁, 例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>
            <a href="https://jquery.com/">
              <h1>jQuery</h1>
              <span class="ui-li-aside">最新 v3.5.1</span>
              <p>可方便操作 DOM 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://jquerymobile.com/">
              <h1>jQuery Mobile</h1>
              <span class="ui-li-aside">最新 v1.4.5</span>
              <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://cordova.apache.org/">
              <h1>Cordova</h1>
              <span class="ui-li-aside">最新 v9.0.0</span>
              <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
            </a>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例只是將上面測試 9 的項目內容用超連結 a 元素包覆使列表清單變成互動式, 並連結官方網頁而已, 結果如下 : 




此例網址 QR code 如下 :



項目內容也可以是圖片, 但需將圖片尺寸調整為 80*80 px 解析度, 例如上面範例可在最前面添加每個函式庫的 logo :


 
<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>
            <a href="https://jquery.com/">
              <img src="jquery-logo.jpg">
              <h1>jQuery</h1>
              <span class="ui-li-aside">最新 v3.5.1</span>
              <p>可方便操作 DOM 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://jquerymobile.com/">
              <img src="jquery-mobile-logo.jpg">
              <h1>jQuery Mobile</h1>
              <span class="ui-li-aside">最新 v1.4.5</span>
              <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://cordova.apache.org/">
              <img src="cordova-logo.jpg">
              <h1>Cordova</h1>
              <span class="ui-li-aside">最新 v9.0.0</span>
              <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
            </a>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在項目內容最前面加上一個 img 元素, 圖片來源為 80*80 之 jpg 檔, 結果如下 :




此例網址 QR code 如下 :



圖片 img 元素也可以套上 class="ui-li-icon" 屬性, 它會將圖片縮成 16*16 的小圖示, 例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li>
            <a href="https://jquery.com/">
              <img src="jquery-logo.jpg" class="ui-li-icon">
              <h1>jQuery</h1>
              <span class="ui-li-aside">最新 v3.5.1</span>
              <p>可方便操作 DOM 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://jquerymobile.com/">
              <img src="jquery-mobile-logo.jpg" class="ui-li-icon">
              <h1>jQuery Mobile</h1>
              <span class="ui-li-aside">最新 v1.4.5</span>
              <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
            </a>
          </li>
          <li>
            <a href="https://cordova.apache.org/">
              <img src="cordova-logo.jpg" class="ui-li-icon">
              <h1>Cordova</h1>
              <span class="ui-li-aside">最新 v9.0.0</span>
              <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
            </a>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例只是將上面測試 11 的 img 元素套上 class="ui-li-icon" 屬性, 結果如下 :




可見原本 80*80 的圖檔被套上 class="ui-li-icon" 樣式後變成 16*16 的小圖示了 (感覺太小了). 此例網址 QR code 如下 :


span 元素除了可套用 class="ui-li-aside" 做為標題的補充說明外, 也可以套用 class="ui-li-count" 作為計數氣泡用, 通常用來顯示文章點閱數, 商品已購買人數, 收件夾信件數目等等, 例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li data-role="list-divider">電子郵件信箱</li>
          <li>
            <a href="#">收件夾</a>
            <span class="ui-li-count">124</span>
          </li>
          <li><a href="#">草稿</a></li>
          <li><a href="#">計件備份</a></li>
          <li>
            <a href="#">垃圾郵件</a>
            <span class="ui-li-count">1247</span>
          </li>
          <li>
            <a href="#">刪除的郵件</a>
            <span class="ui-li-count">581</span>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例為一個 email 郵件信箱, 部分項目內容為一個互動用的超連結 a 元素與一個具有 class="ui-li-count" 屬性的 span 元素, 它會被 jQuery Mobile 描繪成一個計數泡泡覆蓋在大於的互動圖示上, 結果如下 : 




此例網址 QR code 如下 :



不過上面這個範例項目內容中的 a 與 span 元素獨立的結構有個缺點, 即計數泡泡會蓋住表示互動項目之大於圖示, 比較好的網頁結構應該是用 a 元素包覆所有項目內容, 例如 :



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true">
          <li data-role="list-divider">電子郵件信箱</li>
          <li>
            <a href="#">
              <h1>收件夾</h1>
              <span class="ui-li-count">124</span>
            </a>
          </li>
          <li>
            <a href="#">
              <h1>草稿</h1>
            </a>
          </li>
          <li>
            <a href="#">
              <h1>計件備份</h1>
            </a>
          </li>
          <li>
            <a href="#">
              <h1>垃圾郵件</h1>
              <span class="ui-li-count">1247</span>
            </a>            
          </li>
          <li>
            <a href="#">
              <h1>刪除的郵件</h1>
              <span class="ui-li-count">581</span>
            </a>            
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例中以 a 元素包覆全部項目內容, 這樣計數泡泡就會被繪製在右邊表示互動的大於圖示前面, 而不是重疊在上面, 結果如下 : 




此例網址 QR code 如下 :


接著測試 Listview 的篩選框, 如果在 ul/ol 元素中添加 data-filter="true" 屬性, 則 jQuery Mobile 在繪製列表清單前面添加一個搜尋輸入框, 可對清單內容進行篩選, 且可加上 data-filter-placeholder 屬性指定提示訊息, 例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true" data-filter="true" data-filter-placeholder="搜尋">
          <li data-role="list-divider">程式語言</li>
          <li>Python</li>
          <li>C</li>
          <li>C++</li>
          <li>Java</li>
          <li>Javascript</li>
          <li>PHP</li>
          <li>R</li>
          <li>C#</li>
          <li>Julia</li>
          <li>Swift</li>
          <li>Kotlin</li>
          <li>Go</li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例在 ul 元素中添加了 data-filter="true" 與 data-filter-placeholder 屬性, 列表清單上方會出現一個搜尋框可用來篩選清單內容, 結果如下 : 




輸入 C 之後會搜尋清單內容含有 C 的項目, 且只顯示篩選出來的項目, 此例網址 QR code 如下 :



以上的互動式清單範例都是每個項目只有一個操作 (例如載入頁面或連結外部網頁), 所以通常使用超連結 a 元素包覆該項目的全部內容. 如果需要在單一列中執行兩個不同的操作就需要分割清單列, 做法其實就是在項目內容中加入另一個超連結 a 元素 (注意, Litview 的每一個項目最多就只能放兩個 a 元素, 超過會破壞版面) : 

<ul data-role="listview" data-inset="true">
  <li>
    <a href="a.htm">操作A</a>
    <a href="b.htm">操作B</a> 
  </li>
</ul>

其中第一個超連結 "操作 A" 是主體, 會佔據螢幕大部分寬度; 而第二個超連結 "操作 B" 則是客體,  連結文字不會顯示, 而是在該項目列最後面以預設右箭頭 (大於) 圖示來表示 :




點這項目的前段 "操作A" 與後段右箭頭 ("操作B") 會載入不同連結或頁面 (即不同之操作). 如果要指定操作 B 的圖示可在 a 元素中添加 data-icon 屬性指定, 例如 : 

<ul data-role="listview" data-inset="true">
  <li>
    <a href="a.htm">操作A</a>
    <a href="b.htm" data-icon="edit">操作B</a> 
  </li>
</ul>

結果如下 : 




如果每一個項目都是使用同樣的圖示, 則可以在 ul/ol 元素中添加 data-split-icon 屬性來處理, 不需要在每個項目中使用 data-icon 屬性, 例如 : 

<ul data-role="listview" data-inset="true" data-split-icon="edit">
  <li>
    <a href="#">操作A1</a>
    <a href="#">操作B1</a> 
  </li>
  <li>
    <a href="#">操作A2</a>
    <a href="#">操作B2</a> 
  </li>
</ul>

結果如下 : 




也可以添加 data-split-theme 指定分裂欄位之主題佈景, 例如 : 

<ul data-role="listview" data-inset="true" data-split-icon="edit" data-split-icon="b">
  <li>
    <a href="#">操作A1</a>
    <a href="#">操作B1</a> 
  </li>
  <li>
    <a href="#">操作A2</a>
    <a href="#">操作B2</a> 
  </li>
</ul>

下面範例是將測試 10 添加第二個超連結 a 元素指向各函式庫的 GitHub 網頁, 為了讓使用者一看就知道那是連結到 GitHub, 必須自訂一個 GitHub 圖示, 先下載 GitHub 的 Logo 以圖片編輯軟體如 PicPick 將其縮小為 32*32 的 jpg 檔 (或 png) GitHub-logo.jpg 放在專案目錄下, 然後在網頁的 head 中以 :after 偽類別元素添加自訂圖示樣式 .ui-icon-github : 

<style>
   .ui-icon-github:after {background-image: url('GitHub-logo.jpg');}
</style>

類別名稱 ui-icon-githu 結尾的 github 就是此圖示之名稱, 參考 :


這樣就可以在 data-split-icon 屬性中使用自訂名稱為 github 的圖示了, 例如 : 



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
    <style>
      .ui-icon-github:after {background-image: url('GitHub-logo.jpg');}
    </style>
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true" data-split-icon="github">
          <li>
            <a href="https://jquery.com/">
              <h1>jQuery</h1>
              <span class="ui-li-aside">最新 v3.5.1</span>
              <p>可方便操作 DOM 的 Javascript 函式庫</p>
            </a>
            <a href="https://github.com/jquery/jquery">GitHub</a>
          </li>
          <li>
            <a href="https://jquerymobile.com/">
              <h1>jQuery Mobile</h1>
              <span class="ui-li-aside">最新 v1.4.5</span>
              <p>用來製作行動網頁 UI 的 Javascript 函式庫</p>
            </a>
            <a href="https://github.com/jquery/jquery-mobile">GitHub</a>
          </li>
          <li>
            <a href="https://cordova.apache.org/">
              <h1>Cordova</h1>
              <span class="ui-li-aside">最新 v9.0.0</span>
              <p>用來將行動網頁轉成原生 App 的 Javascript 函式庫</p>
            </a>
            <a href="https://github.com/apache/cordova">GitHub</a>
          </li>
        </ul>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
    </section>
  </body>
</html>

此例為每個項目內容添加第二個超連結 a 元素以指向各函式庫的 GitHub 網頁 (使用自訂的 github 圖示), 第一個超連結則仍然指向官網首頁, 結果如下 : 




可見每一個項目 (列) 都被分割成兩欄, 分別對應到兩個超連結, 點左邊主欄會連結到官網首頁, 點右邊欄的圖示則會連結到函式庫的 GitHub 網頁. 此例網址 QR code 如下 :



以上範例全部都只用到 data-role 與 class 屬性, 並未使用 Javascript 程式碼, 下面範例使用 jQuery 程式碼來動態變更 Listview 的項目 :



<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="utf-8">
    <meta http-equiv="cache-control" content="no-cache">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
    <link href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" rel="stylesheet">
  </head>
  <body>
    <!-- 第一頁頁面 -->
    <section data-role="page" id="page1">
      <header data-role="header">
        <h1>列表清單</h1>
      </header>
      <article data-role="content">
        <ul data-role="listview" data-inset="true" id="mylistview">
          <li>項目1</li>
          <li>項目2</li>
          <li>項目3</li>
        </ul>
        <a href="#" data-role="button" id="add_btn">新增項目</a>
        <a href="#" data-role="button" id="remove_btn">刪除項目</a>
      </article>
      <footer data-role="footer">
        <h3>頁尾</h3>
      </footer>
      <script>
        $(document).on("pageinit", "#page1", function(e) {
           var i=1;
           $("#add_btn").on("click", function(e) {
             var mylistview=$("#mylistview");
             mylistview.append("<li>新項目" + i + "</li>");
             mylistview.listview("refresh");
             ++i;
             });
           $("#remove_btn").on("click", function(e) {
             $("li").last().remove();
             if(i>1) {--i};
             });
          });
      </script>
    </section>
  </body>
</html>

此例在 Listview 底下放置了兩個按鈕, 按 "新增項目" 鈕會呼叫 append() 方法添加新項目 (利用全域變數 i 增量); 按 "刪除項目" 鈕會呼叫 li 物件集合的 last() 方法取得最後一個項目物件後再呼叫remove() 方法刪除最後一個項目 (利用全域變數 i 減量), 結果如下 : 




 此例網址 QR code 如下 :


Listview 應該是 jQuery Mobile 最常用的控制項了, 所以花了比較長時間測試. 

沒有留言:

張貼留言