智慧選單

智慧型選取器讓您能輕鬆地將一般的表單選取器轉換成具有分組單選按鈕或核取方塊輸入項的動態頁面。您可以在許多原生 iOS 應用程式中看到這項功能

智慧型選取器版面

智慧型選取器版面非常簡單。它是一個眾所周知的 列表檢視 連結,內含 <select>,以及 item-link 上的附加 smart-select 類別

<div class="list">
  <ul>
    <!-- Smart select item -->
    <li>
      <!-- Additional "smart-select" class -->
      <a href="#" class="item-link smart-select">
        <!-- select -->
        <select name="fruits">
          <option value="apple" selected>Apple</option>
          <option value="pineapple">Pineapple</option>
          ...
        </select>
        <div class="item-content">
          <div class="item-inner">
            <!-- Select label -->
            <div class="item-title">Fruit</div>
            <!-- Selected value, not required -->
            <div class="item-after">Apple</div>
          </div>
        </div>
      </a>
    </li>
    <!-- Another smart selects or list view elements -->
    ...
  </ul>
</div>

請注意,智慧型選取器僅在已初始化的檢視中運作,因為它使用路由器載入智慧型選取器頁面或開啟模態視窗!

自訂選項圖示

我們可以使用 <option> 元素上的 data-option-icon 屬性來指定智慧型選取器頁面的列表檢視(選項)圖示

例如

自訂選項色彩和圖片

我們也可以指定智慧型選取器頁面的列表檢視元素圖片或色彩。我們需要在智慧型選取器 <select>(設定所有選項的預設圖片)或 <option>(設定單一選項的圖片或圖示)上使用附加的 data-option-image 屬性。

對於單一選項,我們也可以使用 data-option-colordata-option-class 屬性來新增特定選項色彩或 css 類別,以進行額外的樣式設定

<li>
  <a href="#" class="item-link smart-select">
    <select name="fruits">
      <option value="apple" selected data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-1.jpg">Apple</option>
      <option value="pineapple" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-2.jpg">Pineapple</option>
      <option value="pear" data-option-color="orange" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-3.jpg">Pear</option>
      ...
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Fruit</div>
      </div>
    </div>
  </a>
</li>

多重選取和 <optgroup>

我們也可以使用多重選取和群組選項,方法是使用 <optgroup>。因此,如果我們將 multiple 屬性新增到我們的選取,則智慧選取頁面上的單選按鈕將自動轉換為核取方塊

<li>
  <a href="#" class="item-link smart-select">
    <!-- "multiple" attribute for multiple select-->
    <select name="car" multiple>
      <!-- options grouped within "optgroup" tag-->
      <optgroup label="Japanese">
        <option value="honda" selected>Honda</option>
        <option value="lexus">Lexus</option>
        ...
      </optgroup>
      <optgroup label="German">
        <option value="audi" selected>Audi</option>
        <option value="bmw">BMW</option>
        ...
      </optgroup>
      <optgroup label="American">
        <option value="cadillac">Cadillac</option>
        <option value="chrysler">Chrysler</option>
        ...
      </optgroup>
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Car</div>
      </div>
    </div>
  </a>
</li>

多重選取和 maxlength

使用多重選取,我們也可以使用 maxlength 屬性來限制可能選取的項目數量

<li>
  <a href="#" class="item-link smart-select">
    <!-- "maxlength" attribute to limit number of possible selected items -->
    <!-- we won't allow to select more than 3 items -->
    <select name="car" multiple maxlength="3">
      <optgroup label="Japanese">
        <option value="honda" selected>Honda</option>
        <option value="lexus">Lexus</option>
        ...
      </optgroup>
      <optgroup label="German">
        <option value="audi">Audi</option>
        <option value="bmw">BMW</option>
        ...
      </optgroup>
      <optgroup label="American">
        <option value="cadillac">Cadillac</option>
        <option value="chrysler">Chrysler</option>
        ...
      </optgroup>
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Car</div>
      </div>
    </div>
  </a>
</li>

不同的顯示值

在選項上使用 data-display-as 屬性,我們可以用不同的方式顯示選取的值

<li>
  <a href="#" class="item-link smart-select">
    <select name="days">
      <option value="monday" selected data-display-as="Mon">Monday</option>
      <option value="tuesday" data-display-as="Tue">Tuesday</option>
      <option value="wednesday" data-display-as="Wed">Wednesday</option>
      <option value="thursday" data-display-as="Thu">Thursday</option>
      <option value="friday" data-display-as="Fri">Friday</option>
      <option value="saturday" data-display-as="Sat">Saturday</option>
      <option value="sunday" data-display-as="Sun">Sunday</option>
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Day</div>
      </div>
    </div>
  </a>
</li>

智慧選取應用程式方法

讓我們來看看相關的應用程式方法,以使用智慧選取

app.smartSelect.create(parameters)- 建立智慧選取實例

  • parameters - object。具有智慧選取參數的物件

方法傳回建立的智慧選取實例

app.smartSelect.destroy(smartSelectEl)- 銷毀智慧選取實例

  • smartSelectEl - HTMLElementstring (使用 CSS 選擇器) 或 object。要銷毀的智慧選取元素或智慧選取實例。

app.smartSelect.get(smartSelectEl)- 透過 HTML 元素取得智慧選取實例

  • smartSelectEl - HTMLElementstring (使用 CSS 選擇器)。智慧選取元素。

方法傳回智慧選取實例

app.smartSelect.open(smartSelectEl)- 開啟智慧選取

  • smartSelectEl - HTMLElementstring (使用 CSS 選擇器)。要開啟的智慧選取元素。

方法傳回智慧選取實例

app.smartSelect.close(smartSelectEl)- 關閉智慧選取

  • smartSelectEl - HTMLElementstring (使用 CSS 選擇器)。要關閉的智慧選取元素。

方法傳回智慧選取實例

智慧選取參數

現在讓我們來看看建立智慧選取所需的可用參數清單

參數類型預設值說明
elHTMLElement智慧選取元素。如果你已經在 HTML 中有智慧選取元素,並且想要使用此元素建立新的實例,這會很有用
viewobject連結到已初始化的檢視實例,這是智慧選取運作所必需的。預設情況下,如果未指定,它將在父檢視中開啟。
valueElHTMLElement要插入選取值的視覺元素。如果未傳遞,它將尋找 <div class="item-after"> 元素
setValueText布林值啟用後,智慧型選取會自動將值文字插入指定的「valueEl」,格式為「formatValueText」傳回的格式。
formatValueText函式(值)自訂函式,用於格式化智慧型選取文字值,該值會顯示在清單項目中 (在 <div class="item-after"> 中)。 是目前值的陣列。
openIn字串頁面定義開啟智慧型選取的方式。可以是 頁面快顯視窗浮動視窗工作表
popupPush布林值啟用智慧型選取快顯視窗,在開啟時將後方的檢視推開。
popupSwipeToClose布林值未定義啟用使用滑動關閉智慧型選取快顯視窗的功能。未指定時,會繼承應用程式的快顯視窗 swipeToClose 參數。
sheetPush布林值啟用智慧型選取工作表,在開啟時將後方的檢視推開。
sheetSwipeToClose布林值未定義啟用使用滑動關閉智慧型選取工作表的功能。未指定時,會繼承應用程式的工作表 swipeToClose 參數。
sheetBackdrop布林值啟用智慧型選取工作表背景。
pageTitle字串智慧型選取頁面標題。如果未傳遞,則會是 <div class="item-title"> 文字。
pageBackLinkText字串返回智慧型選取頁面返回連結文字。
popupCloseLinkText字串關閉智慧型選取快顯視窗關閉連結文字。
popupTabletFullscreen布林值啟用後,智慧型選取快顯視窗會在平板電腦上以全螢幕顯示。
sheetCloseLinkText字串完成智慧型選取工作表關閉連結文字。
searchbar布林值
object
在智慧型選取頁面上啟用搜尋欄。如果傳遞為物件,則應為有效的 搜尋欄參數
searchbarPlaceholder字串搜尋搜尋欄提示文字。
searchbarDisableText字串取消搜尋欄「取消」連結文字。僅在 iOS 主題中有效。
searchbarSpellcheck布林值設定搜尋欄輸入元素上 spellcheck 屬性的值。
appendSearchbarNotFound布林值
字串
HTMLElement
附加區塊,其中包含在沒有搜尋欄結果時顯示的內容。

如果指定為字串,則會附加

<div class="block searchbar-not-found">{{appendSearchbarNotFound}}</div>

如果指定為 true,則

<div class="block searchbar-not-found">Nothing found</div>

如果傳遞 HTMLElement,則會新增該元素。

closeOnSelect布林值如果啟用,則在使用者選擇任何選項後,智慧選單將自動關閉
virtualList布林值如果您的選單有許多(數百、數千)選項,請為智慧選單啟用虛擬清單
virtualListHeight數字
函式
虛擬清單項目高度。如果為數字,則清單項目高度以 px 為單位。如果為函式,則函式應傳回項目高度。
scrollToSelectedItem布林值啟用時,它會在開啟時將智慧選單內容捲動到第一個選取的項目
formColorTheme字串智慧選單頁面表單顏色主題。其中一個預設顏色
navbarColorTheme字串智慧選單導覽列顏色主題。其中一個預設顏色
routableModals布林值將開啟的智慧選單模式(當openInpopuppopoversheet)新增到路由器記錄,這可以透過在路由器記錄中返回來關閉智慧選單,並將目前路徑設定為智慧選單模式。
url字串select/將設定為目前路徑的智慧選單頁面/模式 URL
cssClass字串要在智慧選單容器(頁面、彈出式視窗、彈出視窗或工作表)上設定的附加 CSS 類別名稱
closeByBackdropClick布林值啟用時,智慧選單模式(彈出視窗、彈出式視窗、工作表)將在背景點擊時關閉
inputIconPosition字串'start'選擇選項核取方塊或單選按鈕圖示位置。可以是'start''end'。也可以透過data-input-icon-position屬性在每個選項上設定
optionIcon字串要在所有選項上設定的選項圖示。如果它只是一個字串,則會使用此類別建立一個圖示。如果它的格式為f7:icon_name,則會建立一個 F7-Icons 圖示。如果它的格式為md:icon_name,則會建立一個 Material Icons 圖示
optionIconIos字串optionIcon相同,但僅在 iOS 主題啟用時套用
optionIconMd字串optionIcon相同,但僅在 MD 主題啟用時套用
呈現函式
renderSearchbar函式呈現智慧選單搜尋列下拉式選單的函式,必須傳回搜尋列 HTML 字串
renderItemfunction(item, index)呈現智慧選單項目的函式,必須傳回項目 HTML 字串
renderItemsfunction(items)呈現所有智慧選單項目的函式,必須傳回所有項目的 HTML 字串
renderPagefunction(items)呈現智慧選單頁面的函式,必須傳回完整的頁面 HTML 字串
renderPopupfunction(items)呈現智慧選單彈出式視窗的函式,必須傳回完整的彈出式視窗 HTML 字串
renderSheetfunction(items)呈現智慧選單工作表的函式,必須傳回完整的工作表 HTML 字串
renderPopoverfunction(items)用於呈現智慧選單彈出視窗的函數,必須傳回完整的彈出視窗 HTML 字串
事件
onobject

包含事件處理常式的物件。例如

var smartSelect = app.smartSelect.create({
  ...
  on: {
    opened: function () {
      console.log('Smart select opened')
    }
  }
})

請注意,所有下列參數都可以在 `smartSelect` 屬性下的全域應用程式參數中使用,以設定所有智慧選單的預設值。例如

var app = new Framework7({
  smartSelect: {
    pageTitle: 'Select Option',
    openIn: 'popup',
  }
});

智慧選單方法和屬性

因此,要建立智慧選單,我們必須呼叫

var smartSelect = app.smartSelect.create({ /* parameters */ })

之後,我們會取得其初始化的執行個體(例如上面範例中的 `smartSelect` 變數),其中包含有用的方法和屬性

屬性
smartSelect.app連結至全域應用程式執行個體
smartSelect.el智慧選單 HTML 元素
smartSelect.$el包含智慧選單 HTML 元素的 Dom7 執行個體
smartSelect.valueEl用於顯示值的 HTML 元素
smartSelect.$valueEl包含用於顯示值的 HTML 元素的 Dom7 執行個體
smartSelect.selectEl子選取元素 <select>
smartSelect.$selectEl包含子選取元素的 Dom7 執行個體
smartSelect.url智慧選單 URL(在 `url` 參數中傳遞)
smartSelect.view智慧選單檢視(在 `view` 參數中傳遞)或找到父檢視
smartSelect.params智慧選單參數
方法
smartSelect.open()開啟智慧選單
smartSelect.close()關閉智慧選單
smartSelect.getValue()傳回智慧選單值。如果選取為 `multiple`,則傳回陣列,其中包含已選取的值
smartSelect.setValue(newValue)設定新的智慧選單值。如果選取為 `multiple`,則必須為陣列,其中包含新值
smartSelect.unsetValue()取消設定智慧選單值
smartSelect.scrollToSelectedItem()將智慧選單內容捲動至第一個已選取的項目(開啟時)
smartSelect.destroy()銷毀智慧選單
smartSelect.on(event, handler)新增事件處理常式
smartSelect.once(event, handler)新增事件處理常式,在觸發後將會移除
smartSelect.off(event, handler)移除事件處理常式
smartSelect.off(event)移除指定事件的所有處理常式
smartSelect.emit(event, ...args)觸發實例上的事件

智慧選取事件

智慧選取會在智慧選取元素上觸發下列 DOM 事件,以及在應用程式和智慧選取實例上觸發事件

DOM 事件

事件目標說明
smartselect:beforeopen智慧選取元素<a class="item-link smart-select">智慧選取開啟前會觸發事件。event.detail.prevent 包含在呼叫時會阻止智慧選取開啟的函式
smartselect:open智慧選取元素<a class="item-link smart-select">智慧選取頁面 (或模式) 開始開啟動畫時會觸發事件
smartselect:opened智慧選取元素<a class="item-link smart-select">智慧選取頁面 (或模式) 完成開啟動畫後會觸發事件
smartselect:close智慧選取元素<a class="item-link smart-select">智慧選取頁面 (或模式) 開始關閉動畫時會觸發事件
smartselect:closed智慧選取元素<a class="item-link smart-select">智慧選取頁面 (或模式) 完成關閉動畫後會觸發事件
smartselect:beforedestroy智慧選取元素<a class="item-link smart-select">智慧選取實例即將毀損前會觸發事件

應用程式和智慧選取實例事件

智慧選取實例會在自身實例和應用程式實例上發出事件。應用程式實例事件名稱相同,但前面加上 smartSelect

事件目標引數說明
beforeOpensmartSelect(smartSelect, prevent)智慧選取開啟前會觸發事件。事件處理常式會收到智慧選取實例和在呼叫時會阻止智慧選取開啟的函式,作為引數
smartSelectBeforeOpenapp
opensmartSelect(smartSelect)智慧選取開始開啟動畫時會觸發事件。事件處理常式會收到智慧選取實例,作為引數
smartSelectOpenapp
openedsmartSelect(smartSelect)智慧選取完成開啟動畫後會觸發事件。事件處理常式會收到智慧選取實例,作為引數
smartSelectOpenedapp
closesmartSelect(smartSelect)智慧選取開始關閉動畫時會觸發事件。事件處理常式會收到智慧選取實例,作為引數
smartSelectCloseapp
closedsmartSelect(smartSelect)智慧選取完成關閉動畫後會觸發事件。事件處理常式會收到智慧選取實例,作為引數
smartSelectClosedapp
beforeDestroysmartSelect(smartSelect)智慧選取實例即將毀損前會觸發事件。事件處理常式會收到智慧選取實例,作為引數
smartSelectBeforeDestroyapp

智慧選取自動初始化

如果您不需要使用智慧選取 API,而且您的智慧選取在頁面內部,並在頁面初始化時顯示在 DOM 中,則只要新增額外的 smart-select-init 類別,即可自動初始化

<li>
  <!-- Add smart-select-init class -->
  <a href="#" class="item-link smart-select smart-select-init">
    <!-- select -->
    <select name="fruits">
      <option value="apple" selected>Apple</option>
      <option value="pineapple">Pineapple</option>
      ...
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Fruit</div>
        <div class="item-after">Apple</div>
      </div>
    </div>
  </a>
</li>

在這種情況下,如果您需要存取已建立的智慧選取實例,可以使用 app.smartSelect.get 應用程式方法

var smartSelect = app.smartSelect.get('.smart-select');

使用自動初始化時,您可能需要傳遞額外的參數。在這種情況下,您可以透過智慧選取元素上的 data- 屬性傳遞所有額外的參數

<li>
  <!-- Pass parameters as kebab-case data attributes -->
  <a href="#" class="item-link smart-select smart-select-init" data-open-in="popup" data-virtual-list="true" data-page-back-link-text="Go back">
    <!-- select -->
    <select name="fruits">
      <option value="apple" selected>Apple</option>
      <option value="pineapple">Pineapple</option>
      ...
    </select>
    <div class="item-content">
      <div class="item-inner">
        <div class="item-title">Fruit</div>
        <div class="item-after">Apple</div>
      </div>
    </div>
  </a>
</li>

CSS 變數

以下是相關 CSS 變數 (CSS 自訂屬性) 的清單。

請注意,註解變數預設未指定,其值為在此情況下的備用值。

:root {
  /*
  --f7-smart-select-sheet-bg: var(--f7-list-bg-color);
  --f7-smart-select-sheet-toolbar-border-color: var(--f7-bars-border-color);
  */
}

範例

smart-select.html
<div class="page">
  <div class="navbar">
    <div class="navbar-bg"></div>
    <div class="navbar-inner sliding">
      <div class="title">Smart Select</div>
    </div>
  </div>
  <div class="page-content">
    <div class="block">
      Framework7 allows you to easily convert your usual form selects to dynamic pages with radios:
    </div>
    <div class="list list-strong-ios list-outline-ios list-dividers-ios">
      <ul>
        <li>
          <a class="item-link smart-select smart-select-init">
            <select name="fruits">
              <option value="apple" selected>Apple</option>
              <option value="pineapple">Pineapple</option>
              <option value="pear">Pear</option>
              <option value="orange">Orange</option>
              <option value="melon">Melon</option>
              <option value="peach">Peach</option>
              <option value="banana">Banana</option>
            </select>
            <div class="item-content">
              <div class="item-inner">
                <div class="item-title">Fruit</div>
              </div>
            </div>
          </a>
        </li>
        <li>
          <a class="item-link smart-select smart-select-init" data-open-in="popup" data-searchbar="true"
            data-searchbar-placeholder="Search car">
            <select name="car" multiple>
              <optgroup label="Japanese">
                <option value="honda" selected>Honda</option>
                <option value="lexus">Lexus</option>
                <option value="mazda">Mazda</option>
                <option value="nissan">Nissan</option>
                <option value="toyota">Toyota</option>
              </optgroup>
              <optgroup label="German">
                <option value="audi" selected>Audi</option>
                <option value="bmw">BMW</option>
                <option value="mercedes">Mercedes</option>
                <option value="vw">Volkswagen</option>
                <option value="volvo">Volvo</option>
              </optgroup>
              <optgroup label="American">
                <option value="cadillac">Cadillac</option>
                <option value="chrysler">Chrysler</option>
                <option value="dodge">Dodge</option>
                <option value="ford" selected>Ford</option>
              </optgroup>
            </select>
            <div class="item-content">
              <div class="item-inner">
                <div class="item-title">Car</div>
              </div>
            </div>
          </a>
        </li>
        <li>
          <a class="item-link smart-select smart-select-init" data-open-in="sheet">
            <select name="mac-windows">
              <option value="mac" selected>Mac</option>
              <option value="windows">Windows</option>
            </select>
            <div class="item-content">
              <div class="item-inner">
                <div class="item-title">Mac or Windows</div>
              </div>
            </div>
          </a>
        </li>
        <li>
          <a class="item-link smart-select smart-select-init" data-open-in="popover">
            <select name="superhero" multiple>
              <option value="Batman" selected>Batman</option>
              <option value="Superman">Superman</option>
              <option value="Hulk">Hulk</option>
              <option value="Spiderman">Spiderman</option>
              <option value="Ironman">Ironman</option>
              <option value="Thor">Thor</option>
              <option value="Wonder Woman">Wonder Woman</option>
            </select>
            <div class="item-content">
              <div class="item-inner">
                <div class="item-title">Super Hero</div>
              </div>
            </div>
          </a>
        </li>
      </ul>
    </div>
  </div>
</div>