スポンサー
Support Framework7

オートコンプリート

    Framework7には、モバイルフレンドリーでタッチ操作に最適化されたオートコンプリートコンポーネントが搭載されています。

    オートコンプリートは、スタンドアロン モードまたはドロップダウンとして使用できます。

    オートコンプリートアプリのメソッド

    オートコンプリートの作成と初期化は、JavaScriptのみで行うことができます。関連するアプリのメソッドを使用する必要があります。

    app.autocomplete.create(parameters)- オートコンプリートのインスタンスの作成

    • parameters - object. オートコンプリートのパラメータを持つオブジェクト

    メソッドは作成されたオートコンプリートのインスタンスを返します。

    app.autocomplete.destroy(el)- オートコンプリートのインスタンスを破棄する

    • el - HTMLElementまたはstring(CSSセレクタ付き)またはobject。破棄するオートコンプリートのインスタンスです。

    app.autocomplete.get(el)- HTML要素によるオートコンプリートインスタンスの取得

    • el - HTMLElement または string (CSS Selectorを使用). オートコンプリートの要素。

    メソッドは、オートコンプリートのインスタンスを返します。

    app.autocomplete.open(el)- オートコンプリートを開く

    • el - HTMLElementまたはstring (CSSセレクタ付き)のオートコンプリート要素。開くオートコンプリートの要素を指定します。

    メソッドはオートコンプリートのインスタンスを返します。

    app.autocomplete.close(el)- オートコンプリートを閉じる

    • el - HTMLElementまたはstring (CSSセレクタ付き)のオートコンプリート要素。オートコンプリートの要素を閉じます。

    メソッドはオートコンプリートのインスタンスを返す

    例:

    var autocomplete = app.autocomplete.create({
      inputEl: '#autocomplete-dropdown',
      openIn: 'dropdown',
      source: function (query, render) {
        ...
      }
    });

    オートコンプリートのパラメータ

    利用可能なパラメータの一覧を見てみましょう。

    ParameterTypeDefaultDescription
    openInstringpageオートコンプリートを開く方法を定義します。ページポップアップ(スタンドアロンの場合)、ドロップダウンのいずれかです。
    sourcefunction (query, render)検索を受け付ける関数 query と、マッチしたアイテムを含む配列を渡す必要がある render 関数。
    limitnumberクエリごとにオートコンプリートに表示されるアイテムの最大数を制限する
    preloaderbooleanfalseオートコンプリートのレイアウトにプリローダーを含めるには、trueに設定します。
    preloaderColorstringプレローダの色(デフォルトカラーのうちのひとつ
    valuearray選択されたデフォルトの値を持つ配列
    valuePropertystringidアイテムの値を表すマッチドアイテムオブジェクトのキーの名前
    textPropertystringtext表示されるオプションのタイトルとして使用される、アイテムの表示値を表すマッチしたアイテムオブジェクトのキーの名前
    Standalone Autocomplete Parameters
    requestSourceOnOpenbooleanfalse有効な場合は、オートコンプリートを開く際に source 関数に渡されます。
    openerElstring
    HTMLElement
    クリックするとスタンドアロンのオートコンプリートページまたはポップアップを開くリンクの CSS セレクタまたは HTML 要素の文字列。
    popupCloseLinkTextstringCloseポップアップとして開いたときの「閉じる」ボタンのデフォルトテキスト
    pageBackLinkTextstringBackページとして開いたときの「戻る」リンクの既定のテキスト
    pageTitlestringオートコンプリートページのタイトル。何も指定されておらず、openerEl がリストビューのアイテムである場合は、item-title 要素のテキスト値が使用されます。
    popupPushbooleanfalseオートコンプリートのポップアップを開いたときに、後ろにビューを表示できるようになりました。
    popupSwipeToClosebooleanundefinedスワイプでオートコンプリートのポップアップを閉じる機能を有効にします。指定されていない場合は、アプリの Popup swipeToClose パラメータを継承します。
    sheetPushbooleanfalseオートコンプリートシートを開いたときに、ビューを後ろに押す機能を有効にします。
    sheetSwipeToClosebooleanundefinedスワイプでオートコンプリートシートを閉じる機能を有効にします。指定しない場合は、アプリの Sheet swipeToClose パラメータを継承します。
    searchbarPlaceholderstringSearch...検索バーのプレースホルダーテキスト
    searchbarDisableTextstringCancelサーチバーの "Cancel" ボタンのテキスト
    searchbarSpellcheckbooleanfalseサーチバーの入力要素の spellcheck 属性の値を設定します。
    notFoundTextstringNothing found一致するものがなかった場合に表示されるテキスト
    multiplebooleanfalsetrue`に設定すると、複数の選択が可能になります。
    closeOnSelectbooleanfalsetrueに設定すると、ユーザーが値を選択した時点でオートコンプリートが終了します。multiple が有効な場合は使用できません。
    autoFocusbooleanfalsetrue`に設定すると、オートコンプリートを開いたときに検索フィールドが自動でフォーカスされます。
    animatebooleantruefalse`に設定すると、アニメーションなしでスタンドアロンのオートコンプリートが開きます。
    navbarColorThemestringナビゲーションバーのカラーテーマ。デフォルトの カラーテーマ のいずれかです。
    formColorThemestringフォーム (チェックボックスやラジオ) のカラーテーマ。デフォルトのカラーテーマのうちの1つ。
    routableModalsbooleanfalse開いたオートコンプリートのモーダル(openIn: 'popup'の場合)をルーターの履歴に追加します。これにより、ルーターの履歴に戻って現在のルートをオートコンプリートのモーダルに設定することで、オートコンプリートを閉じることができます。
    urlstringselect/現在のルートとして設定される、スタンドアロンのオートコンプリートの URL。
    viewobjectスタンドアロン オートコンプリートを使用する場合、初期化されたビュー インスタンスへのリンク。デフォルトでは、指定されていない場合、メインビューで開かれます。
    Dropdown Autocomplete Parameters
    inputElstring
    HTMLElement
    CSS セレクタまたは関連テキスト入力の HTML 要素を持つ文字列
    inputEventsstringinputオートコンプリートのアクションとソースリクエストの処理に使用される入力イベントを設定できます。例えば、漢字の合成が可能なキーボードを使用している場合は、change keyup compositionendに変更することができます。
    highlightMatchesbooleantrueオートコンプリートの結果でマッチした部分をハイライトする
    typeaheadbooleanfalse先読みを有効にすると、入力値をマッチした最初の項目で先に埋めます。
    dropdownPlaceholderTextstringドロップダウンのプレースホルダーテキストの指定
    updateInputValueOnSelectbooleantruetrue`の場合、関連する入力の値も更新されます。
    expandInputbooleanfalsetrue`であれば、リストビューでアイテム入力として使用されている入力は、ドロップダウンが表示されている間、フルスクリーン幅に拡大されます。
    dropdownContainerElstring
    HTMLElement
    デフォルトでは、ドロップダウンは親のpage-content要素に追加されます。ドロップダウン要素を追加する別の要素をここで指定することができます。
    Render functions
    renderDropdownfunction(items)オートコンプリートのドロップダウンを描画する関数(ドロップダウンのHTML文字列を返さなければならない
    renderPagefunction(items)オートコンプリートのページを描画する関数で、ページの HTML 文字列を返す必要があります。
    renderPopupfunction(items)オートコンプリートポップアップを表示する機能(popup HTML 文字列を返す必要があります
    renderItemfunction(item, index)シングルオートコンプリートをレンダリングする関数は item HTML 文字列を返す必要があります。
    renderSearchbarfunction検索バーを表示する機能は、searchbar HTML 文字列を返す必要があります。
    renderNavbarfunctionナビバーを表示する機能は、navbar HTML 文字列を返す必要があります。
    Events
    onobject

    イベント ハンドラを持つオブジェクトです。例えば、以下のようになります。

    var autocomplete = app.autocomplete.create({
      ...
      on: {
        opened: function () {
          console.log('Autocomplete opened')
        }
      }
    })

    以下のすべてのパラメータは、アプリのグローバルパラメータの autocomplete プロパティで使用でき、すべてのオートコンプリートのデフォルトを設定できます。例えば、以下のようになります。

    var app = new Framework7({
      autocomplete: {
        openIn: 'popup',
        animate: false,
      }
    });

    オートコンプリートのメソッドとプロパティ

    オートコンプリートを初期化すると、初期化されたインスタンスが変数(上記の例では autocomplete 変数)に格納され、便利なメソッドやプロパティが表示されます。

    Properties
    autocomplete.params初期化パラメータが渡されたオブジェクト
    autocomplete.value選択されたアイテムの配列
    autocomplete.openedオートコンプリートが現在開かれている場合は true となります。
    autocomplete.openerElオートコンプリートのオープナー要素の HTML 要素 (初期化時に渡された場合)
    autocomplete.$openerElオートコンプリート・オープナー要素の Dom7 インスタンス (init で渡された場合)
    autocomplete.inputElオートコンプリート入力のHTML要素(initで渡された場合
    autocomplete.$inputElオートコンプリート入力のDom7インスタンス(第一引数に渡された場合
    autocomplete.$dropdownElオートコンプリートのドロップダウンの Dom7 インスタンス
    autocomplete.urlオートコンプリートのURL (url パラメータで渡されたもの)
    autocomplete.viewオートコンプリートのビュー (view パラメータで渡されたもの) または親ビューの検索
    autocomplete.elオートコンプリート コンテナの HTML 要素 (ドロップダウン要素、ポップアップ要素、またはページ要素)。オートコンプリートが開かれたときに利用可能
    autocomplete.$elオートコンプリート コンテナの Dom7 インスタンス: ドロップダウン要素、またはポップアップ要素、またはページ要素。オートコンプリートを開いたときに使用可能
    autocomplete.searchbarオートコンプリートページ サーチバーインスタンス
    Methods
    autocomplete.open()オートコンプリートを開く (ドロップダウン、ページ、またはポップアップ)
    autocomplete.close()オートコンプリートを閉じる
    autocomplete.preloaderShow()オートコンプリートのプリローダーの表示
    autocomplete.preloaderHide()オートコンプリートのプリローダーを隠す
    autocomplete.destroy()オートコンプリート インスタンスを破棄し、すべてのイベントを削除する
    autocomplete.on(event, handler)イベント ハンドラの追加
    autocomplete.once(event, handler)発生後に削除されるイベント ハンドラの追加
    autocomplete.off(event, handler)イベントハンドラの削除
    autocomplete.off(event)指定したイベントのハンドラをすべて削除する
    autocomplete.emit(event, ...args)インスタンスでイベントを発生させる

    オートコンプリートのイベント

    オートコンプリートのインスタンスは、自己のインスタンスとアプリのインスタンスの両方でイベントを発行します。アプリのインスタンスのイベントは、同じ名前でプレフィックスとして autocomplete が付きます。

    EventTargetArgumentsDescription
    changeautocompleteautocomplete, valueオートコンプリートの値が変更されると、イベントが発生します。戻り値の value は、選択されたアイテムを含む配列です。
    autocompleteChangeapp
    openautocompleteautocompleteイベントは、オートコンプリートがオープニングアニメーションを開始したときに発生します。イベントハンドラの引数として、オートコンプリートのインスタンスが渡されます。
    autocompleteOpenapp
    openedautocompleteautocompleteイベントは、オートコンプリートがオープニングアニメーションを完了した後に発生します。引数のイベントハンドラがオートコンプリートのインスタンスを受け取ると
    autocompleteOpenedapp
    closeautocompleteautocompleteオートコンプリートが閉じるアニメーションを開始すると、イベントが発生します。引数のイベントハンドラがオートコンプリートのインスタンスを受け取ると
    autocompleteCloseapp
    closedautocompleteautocompleteオートコンプリートが閉じるアニメーションを完了すると、イベントが発生します。引数のイベントハンドラがオートコンプリートのインスタンスを受け取ると
    autocompleteClosedapp
    beforeDestroyautocompleteautocompleteオートコンプリートのインスタンスが破棄される直前にイベントが発生します。引数のイベント ハンドラがオートコンプリート インスタンスを受け取ると
    autocompleteBeforeDestroyapp

    CSS Variables

    Below is the list of related CSS variables (CSS custom properties).

    Note that commented variables are not specified by default and their values is what they fallback to in this case.

    :root {
      --f7-autocomplete-dropdown-placeholder-color: #a9a9a9;
      --f7-autocomplete-dropdown-preloader-size: 20px;
      --f7-autocomplete-dropdown-font-size: var(--f7-list-font-size);
      /*
      --f7-autocomplete-dropdown-selected-bg-color: rgba(var(--f7-theme-color-rgb), 0.2);
      */
      --f7-autocomplete-dropdown-bg-color: #fff;
    }
    :root .theme-dark,
    :root.theme-dark {
      --f7-autocomplete-dropdown-bg-color: #1c1c1d;
    }
    .ios {
      --f7-autocomplete-dropdown-box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.2);
      --f7-autocomplete-dropdown-text-matching-font-weight: 600;
      --f7-autocomplete-dropdown-text-color: #000;
      --f7-autocomplete-dropdown-text-matching-color: #000;
    }
    .ios .theme-dark,
    .ios.theme-dark {
      --f7-autocomplete-dropdown-text-color: #fff;
      --f7-autocomplete-dropdown-text-matching-color: #fff;
    }
    .md {
      --f7-autocomplete-dropdown-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.25);
      --f7-autocomplete-dropdown-text-matching-font-weight: 400;
      --f7-autocomplete-dropdown-text-color: rgba(0, 0, 0, 0.54);
      --f7-autocomplete-dropdown-text-matching-color: #212121;
    }
    .md .theme-dark,
    .md.theme-dark {
      --f7-autocomplete-dropdown-text-color: rgba(255, 255, 255, 0.54);
      --f7-autocomplete-dropdown-text-matching-color: rgba(255, 255, 255, 0.87);
    }
    .aurora {
      --f7-autocomplete-dropdown-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
      --f7-autocomplete-dropdown-text-matching-font-weight: 700;
      --f7-autocomplete-dropdown-text-color: #000;
      --f7-autocomplete-dropdown-text-matching-color: #000;
    }
    .aurora .theme-dark,
    .aurora.theme-dark {
      --f7-autocomplete-dropdown-text-color: #fff;
      --f7-autocomplete-dropdown-text-matching-color: #fff;
    }
    

    Examples

    <template>
      <div class="page">
        <div class="navbar">
          <div class="navbar-bg"></div>
          <div class="navbar-inner sliding">
            <div class="title">Autocomplete</div>
            <div class="subnavbar">
              <form class="searchbar" id="searchbar-autocomplete">
                <div class="searchbar-inner">
                  <div class="searchbar-input-wrap">
                    <input type="search" placeholder="Search" />
                    <i class="searchbar-icon"></i>
                    <span class="input-clear-button"></span>
                  </div>
                  <span class="searchbar-disable-button">Cancel</span>
                </div>
              </form>
            </div>
          </div>
        </div>
        <div class="page-content">
          <div class="block-title">Dropdown Autocomplete</div>
          <div class="list no-hairlines-md">
            <div class="block-header">Simple Dropdown Autocomplete</div>
            <ul>
              <li class="item-content item-input inline-label">
                <div class="item-inner">
                  <div class="item-title item-label">Fruit</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown" type="text" placeholder="Fruit" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With Input Expand</div>
            <ul>
              <li class="item-content item-input inline-label">
                <div class="item-inner">
                  <div class="item-title item-label">Fruit</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-expand" type="text" placeholder="Fruit" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With All Values</div>
            <ul>
              <li class="item-content item-input">
                <div class="item-inner">
                  <div class="item-title item-label">Fruit</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-all" type="text" placeholder="Fruit" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With Placeholder</div>
            <ul>
              <li class="item-content item-input">
                <div class="item-inner">
                  <div class="item-title item-label">Fruit</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-placeholder" type="text" placeholder="Fruit" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With Typeahead</div>
            <ul>
              <li class="item-content item-input">
                <div class="item-inner">
                  <div class="item-title item-label">Fruit</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-typeahead" type="text" placeholder="Fruit" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With Ajax-Data</div>
            <ul>
              <li class="item-content item-input">
                <div class="item-inner">
                  <div class="item-title item-label">Language</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-ajax" type="text" placeholder="Language" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="list no-hairlines-md">
            <div class="block-header">Dropdown With Ajax-Data + Typeahead</div>
            <ul>
              <li class="item-content item-input">
                <div class="item-inner">
                  <div class="item-title item-label">Language</div>
                  <div class="item-input-wrap">
                    <input id="autocomplete-dropdown-ajax-typeahead" type="text" placeholder="Language" />
                  </div>
                </div>
              </li>
            </ul>
          </div>
          <div class="block-title">Standalone Autocomplete</div>
          <div class="list">
            <div class="block-header">Simple Standalone Autocomplete</div>
            <ul>
              <li>
                <a class="item-link item-content" href="#" id="autocomplete-standalone">
                  <input type="hidden" />
                  <div class="item-inner">
                    <div class="item-title">Favorite Fruite</div>
                    <div class="item-after"></div>
                  </div>
                </a>
              </li>
            </ul>
          </div>
          <div class="list">
            <div class="block-header">Popup Autocomplete</div>
            <ul>
              <li>
                <a class="item-link item-content" href="#" id="autocomplete-standalone-popup">
                  <input type="hidden" />
                  <div class="item-inner">
                    <div class="item-title">Favorite Fruite</div>
                    <div class="item-after"></div>
                  </div>
                </a>
              </li>
            </ul>
          </div>
          <div class="list">
            <div class="block-header">Multiple Values</div>
            <ul>
              <li>
                <a class="item-link item-content" href="#" id="autocomplete-standalone-multiple">
                  <input type="hidden" />
                  <div class="item-inner">
                    <div class="item-title">Favorite Fruite</div>
                    <div class="item-after"></div>
                  </div>
                </a>
              </li>
            </ul>
          </div>
          <div class="list">
            <div class="block-header">With Ajax-Data</div>
            <ul>
              <li>
                <a class="item-link item-content" href="#" id="autocomplete-standalone-ajax">
                  <input type="hidden" />
                  <div class="item-inner">
                    <div class="item-title">Language</div>
                    <div class="item-after"></div>
                  </div>
                </a>
              </li>
            </ul>
          </div>
        </div>
      </div></template>
    <script>
      export default (props, { $, $f7, $on }) => {
        const fruits = 'Apple Apricot Avocado Banana Melon Orange Peach Pear Pineapple'.split(' ');
    
        let searchbar;
        let autocompleteDropdownSimple;
        let autocompleteDropdownExpand;
        let autocompleteDropdownAll;
        let autocompleteDropdownPlaceholder;
        let autocompleteDropdownTypeahead;
        let autocompleteDropdownAjax;
        let autocompleteDropdownAjaxTypeahead;
        let autocompleteStandaloneSimple;
        let autocompleteStandalonePopup;
        let autocompleteStandaloneMultiple;
        let autocompleteStandaloneAjax;
    
        $on('pageInit', () => {
          autocompleteDropdownSimple = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown',
            openIn: 'dropdown',
            source: function (query, render) {
              console.log(query);
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          });
    
          // Dropdown with input expand
          autocompleteDropdownExpand = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-expand',
            openIn: 'dropdown',
            expandInput: true, // expand input
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          });
    
          // Dropdown with all values
          autocompleteDropdownAll = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-all',
            openIn: 'dropdown',
            source: function (query, render) {
              var results = [];
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          });
    
          // Dropdown with placeholder
          autocompleteDropdownPlaceholder = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-placeholder',
            openIn: 'dropdown',
            dropdownPlaceholderText: 'Try to type "Apple"',
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          });
    
          // Dropdown with typeahead
          autocompleteDropdownTypeahead = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-typeahead',
            openIn: 'dropdown',
            dropdownPlaceholderText: 'Try to type "Pineapple"',
            typeahead: true,
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) === 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          });
    
          // Dropdown with ajax data
          autocompleteDropdownAjax = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-ajax',
            openIn: 'dropdown',
            preloader: true, //enable preloader
            /* If we set valueProperty to "id" then input value on select will be set according to this property */
            valueProperty: 'name', //object's "value" property name
            textProperty: 'name', //object's "text" property name
            limit: 20, //limit to 20 results
            dropdownPlaceholderText: 'Try "JavaScript"',
            source: function (query, render) {
              var autocomplete = this;
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Show Preloader
              autocomplete.preloaderShow();
    
              // Do Ajax request to Autocomplete data
              $f7.request({
                url: './autocomplete-languages.json',
                method: 'GET',
                dataType: 'json',
                //send "query" to server. Useful in case you generate response dynamically
                data: {
                  query: query,
                },
                success: function (data) {
                  // Find matched items
                  for (var i = 0; i < data.length; i++) {
                    if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(data[i]);
                  }
                  // Hide Preoloader
                  autocomplete.preloaderHide();
                  // Render items by passing array with result items
                  render(results);
                }
              });
            }
          });
    
          // Dropdown with ajax data
          autocompleteDropdownAjaxTypeahead = $f7.autocomplete.create({
            inputEl: '#autocomplete-dropdown-ajax-typeahead',
            openIn: 'dropdown',
            preloader: true, //enable preloader
            /* If we set valueProperty to "id" then input value on select will be set according to this property */
            valueProperty: 'name', //object's "value" property name
            textProperty: 'name', //object's "text" property name
            limit: 20, //limit to 20 results
            typeahead: true,
            dropdownPlaceholderText: 'Try "JavaScript"',
            source: function (query, render) {
              var autocomplete = this;
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Show Preloader
              autocomplete.preloaderShow();
    
              // Do Ajax request to Autocomplete data
              $f7.request({
                url: './autocomplete-languages.json',
                method: 'GET',
                dataType: 'json',
                //send "query" to server. Useful in case you generate response dynamically
                data: {
                  query: query,
                },
                success: function (data) {
                  // Find matched items
                  for (var i = 0; i < data.length; i++) {
                    if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) === 0) results.push(data[i]);
                  }
                  // Hide Preoloader
                  autocomplete.preloaderHide();
                  // Render items by passing array with result items
                  render(results);
                }
              });
            }
          });
    
          // Simple Standalone
          autocompleteStandaloneSimple = $f7.autocomplete.create({
            openIn: 'page', //open in page
            openerEl: '#autocomplete-standalone', //link that opens autocomplete
            closeOnSelect: true, //go back after we select something
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            },
            on: {
              change: function (value) {
                console.log(value);
                // Add item text value to item-after
                $('#autocomplete-standalone').find('.item-after').text(value[0]);
                // Add item value to input value
                $('#autocomplete-standalone').find('input').val(value[0]);
              },
            },
          });
    
          // Standalone Popup
          autocompleteStandalonePopup = $f7.autocomplete.create({
            openIn: 'popup', //open in page
            openerEl: '#autocomplete-standalone-popup', //link that opens autocomplete
            closeOnSelect: true, //go back after we select something
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            },
            on: {
              change: function (value) {
                // Add item text value to item-after
                $('#autocomplete-standalone-popup').find('.item-after').text(value[0]);
                // Add item value to input value
                $('#autocomplete-standalone-popup').find('input').val(value[0]);
              },
            },
          });
    
          // Multiple Standalone
          autocompleteStandaloneMultiple = $f7.autocomplete.create({
            openIn: 'page', //open in page
            openerEl: '#autocomplete-standalone-multiple', //link that opens autocomplete
            multiple: true, //allow multiple values
            source: function (query, render) {
              var autocomplete = this;
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            },
            on: {
              change: function (value) {
                // Add item text value to item-after
                $('#autocomplete-standalone-multiple').find('.item-after').text(value.join(', '));
                // Add item value to input value
                $('#autocomplete-standalone-multiple').find('input').val(value.join(', '));
              }
            }
          });
    
          // Standalone With Ajax
          autocompleteStandaloneAjax = $f7.autocomplete.create({
            openIn: 'page', //open in page
            openerEl: '#autocomplete-standalone-ajax', //link that opens autocomplete
            multiple: true, //allow multiple values
            valueProperty: 'id', //object's "value" property name
            textProperty: 'name', //object's "text" property name
            limit: 50,
            preloader: true, //enable preloader
            source: function (query, render) {
              var autocomplete = this;
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Show Preloader
              autocomplete.preloaderShow();
              // Do Ajax request to Autocomplete data
              $f7.request({
                url: './autocomplete-languages.json',
                method: 'GET',
                dataType: 'json',
                //send "query" to server. Useful in case you generate response dynamically
                data: {
                  query: query
                },
                success: function (data) {
                  // Find matched items
                  for (var i = 0; i < data.length; i++) {
                    if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(data[i]);
                  }
                  // Hide Preoloader
                  autocomplete.preloaderHide();
                  // Render items by passing array with result items
                  render(results);
                }
              });
            },
            on: {
              change: function (value) {
                var itemText = [],
                  inputValue = [];
                for (var i = 0; i < value.length; i++) {
                  itemText.push(value[i].name);
                  inputValue.push(value[i].id);
                }
                // Add item text value to item-after
                $('#autocomplete-standalone-ajax').find('.item-after').text(itemText.join(', '));
                // Add item value to input value
                $('#autocomplete-standalone-ajax').find('input').val(inputValue.join(', '));
              },
            },
          });
    
          // Searchbar Autocomplete
          autocompleteSearchbar = $f7.autocomplete.create({
            openIn: 'dropdown',
            inputEl: '#searchbar-autocomplete input[type="search"]',
            dropdownPlaceholderText: 'Type "Apple"',
            source: function (query, render) {
              var results = [];
              if (query.length === 0) {
                render(results);
                return;
              }
              // Find matched items
              for (var i = 0; i < fruits.length; i++) {
                if (fruits[i].toLowerCase().indexOf(query.toLowerCase()) >= 0) results.push(fruits[i]);
              }
              // Render items by passing array with result items
              render(results);
            }
          })
    
          searchbar = $f7.searchbar.create({
            el: '#searchbar-autocomplete',
            customSearch: true,
            on: {
              search: function (sb, query) {
                console.log(query);
              }
            }
          })
        })
    
        return $render;
      }
    </script>