自动完成

Framework7 附带了移动友好且触控优化的自动完成组件。

自动完成可以独立使用,也可以作为下拉菜单使用。

自动完成应用方法

自动完成只能使用 JavaScript 创建和初始化。我们需要使用相关应用程序的方法

app.autocomplete.create(parameters)- 创建自动完成实例

  • parameters - object。具有自动完成参数的对象

方法返回创建的自动完成实例

app.autocomplete.destroy(el)- 销毁自动完成实例

  • el - HTMLElementstring(使用 CSS 选择器)或 object。要销毁的自动完成实例。

app.autocomplete.get(el)- 通过 HTML 元素获取自动完成实例

  • el - HTMLElementstring(使用 CSS 选择器)。自动完成元素。

方法返回自动完成实例

app.autocomplete.open(el)- 打开自动完成

  • el - HTMLElementstring(使用 CSS 选择器)。要打开的自动完成元素。

方法返回自动完成实例

app.autocomplete.close(el)- 关闭自动完成

  • el - HTMLElementstring(使用 CSS 选择器)。要关闭的自动完成元素。

方法返回自动完成实例

例如

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

自动完成参数

让我们看一下所有可用参数的列表

参数类型默认描述
openIn字符串页面定义如何打开自动完成,可以是 pagepopup(对于独立)或 dropdown
source函数 (query, render)接受搜索 queryrender 函数的函数,您需要在其中传递带有匹配项的数组
limit数字限制每次查询自动完成中显示的最大项目数
preloader布尔值false设置为 true 以将预加载器包含到自动完成布局中
preloaderColor字符串预加载器颜色,默认颜色 之一
value数组具有默认选中值的数组
valueProperty字符串id匹配项对象的键的名称,表示项值
textProperty字符串文本匹配项对象的键的名称,表示项显示值,用作显示选项的标题
独立自动完成参数
requestSourceOnOpen布尔值false如果启用,则它将在自动完成打开时请求传递给 source 函数
openerEl字符串
HTMLElement
带有 CSS 选择器或链接的 HTMLElement 的字符串,将在单击时打开独立的自动完成页面或弹出窗口
popupCloseLinkText字符串关闭作为弹出窗口打开时“关闭”按钮的默认文本
pageBackLinkText字符串返回作为页面打开时“返回”链接的默认文本
pageTitle字符串自动完成页面标题。如果没有指定并传递了 openerEl 作为列表视图的项,则将使用 item-title 元素的文本值
popupPush布尔值false使自动完成弹出窗口在打开时将视图推到后面
popupSwipeToClose布尔值undefined允许使用滑动关闭自动完成弹出窗口。 如果未指定,它将继承应用程序弹出窗口的 swipeToClose 参数
sheetPush布尔值false使自动完成表单在打开时将视图推到后面
sheetSwipeToClose布尔值undefined允许使用滑动关闭自动完成表单。 如果未指定,它将继承应用程序表单的 swipeToClose 参数
searchbarPlaceholder字符串搜索...搜索栏占位符文本
searchbarDisableText字符串取消搜索栏“取消”按钮文本
searchbarSpellcheck布尔值false设置搜索栏输入元素上 spellcheck 属性的值
notFoundText字符串未找到结果未找到匹配项时显示的文本
multiple布尔值false设置为 true 以允许多选
closeOnSelect布尔值false设置为 true 并且当用户选择值时自动完成将关闭。 如果启用了 multiple,则不可用
autoFocus布尔值false设置为 true 以在自动完成打开时自动聚焦搜索字段
animate布尔值true设置为 false 以打开没有动画的独立自动完成
navbarColorTheme字符串导航栏颜色主题。 默认颜色主题之一
formColorTheme字符串表单(复选框或单选按钮)颜色主题。 默认颜色主题之一
routableModals布尔值false会将已打开的自动完成模态框(当 openIn: 'popup' 时)添加到路由器历史记录中,这使得可以通过返回路由器历史记录来关闭自动完成并将当前路由设置为自动完成模态框
url字符串select/将设置为当前路由的独立自动完成 URL
viewobject如果要使用独立自动完成,请链接到已初始化的 View 实例。 默认情况下,如果未指定,它将在主视图中打开。
下拉自动完成参数
inputEl字符串
HTMLElement
包含相关文本输入的 CSS 选择器或 HTMLElement 的字符串
inputEvents字符串input允许配置用于处理自动完成操作和源请求的输入事件。 例如,如果您使用带有中文组合的键盘,则可以更改为 change keyup compositionend
highlightMatches布尔值true突出显示自动完成结果中的匹配项
typeahead布尔值false启用提前输入,将使用匹配项中的第一项预先填充输入值
dropdownPlaceholderText字符串指定下拉占位符文本
updateInputValueOnSelect布尔值true如果为 true,则相关输入的值也将更新
dropdownContainerEl字符串
HTMLElement
默认情况下,下拉菜单将添加到父页面内容元素。 您可以在此处指定添加下拉元素的不同元素
渲染函数
renderDropdownfunction(items)用于渲染自动完成下拉列表的函数,必须返回下拉列表 HTML 字符串
renderPagefunction(items)用于渲染自动完成页面的函数,必须返回页面 HTML 字符串
renderPopupfunction(items)用于渲染自动完成弹出窗口的函数,必须返回弹出窗口 HTML 字符串
renderItemfunction(item, index)用于渲染单个自动完成项的函数,必须返回项目 HTML 字符串
renderSearchbarfunction用于渲染搜索栏的函数,必须返回搜索栏 HTML 字符串
renderNavbarfunction用于渲染导航栏的函数,必须返回导航栏 HTML 字符串
事件
onobject

包含事件处理程序的对象。 例如

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

请注意,以下所有参数都可以在 autocomplete 属性下的全局应用程序参数中使用,以为所有自动完成项设置默认值。 例如

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

自动完成方法和属性

初始化 Autocomplete 后,我们会在变量(如上面的 autocomplete 变量)中获得其初始化实例,其中包含有用的方法和属性

属性
autocomplete.params包含传递的初始化参数的对象
autocomplete.value包含所选项目的数组
autocomplete.opened如果 Autocomplete 当前已打开,则为 true
autocomplete.openerElAutocomplete 打开器元素的 HTML 元素(如果在初始化时传递)
autocomplete.$openerElAutocomplete 打开器元素的 Dom7 实例(如果在初始化时传递)
autocomplete.inputElAutocomplete 输入的 HTML 元素(如果在初始化时传递)
autocomplete.$inputElAutocomplete 输入的 Dom7 实例(如果在初始化时传递)
autocomplete.$dropdownElAutocomplete 下拉列表的 Dom7 实例
autocomplete.urlAutocomplete URL(在 url 参数中传递)
autocomplete.viewAutocomplete 视图(在 view 参数中传递)或找到的父视图
autocomplete.elAutocomplete 容器的 HTML 元素:下拉元素、弹出元素或页面元素。 在 Autocomplete 打开时可用
autocomplete.$elAutocomplete 容器的 Dom7 实例:下拉元素、弹出元素或页面元素。 在 Autocomplete 打开时可用
autocomplete.searchbarAutocomplete 页面 Searchbar 实例
方法
autocomplete.open()打开 Autocomplete(下拉列表、页面或弹出窗口)
autocomplete.close()关闭 Autocomplete
autocomplete.preloaderShow()显示自动完成预加载器
autocomplete.preloaderHide()隐藏自动完成预加载器
autocomplete.destroy()销毁 Autocomplete 实例并移除所有事件
autocomplete.on(event, handler)添加事件处理程序
autocomplete.once(event, handler)添加事件处理程序,该程序在触发后将被移除
autocomplete.off(event, handler)移除事件处理程序
autocomplete.off(event)移除指定事件的所有处理程序
autocomplete.emit(event, ...args)在实例上触发事件

自动完成事件

Autocomplete 实例在自身实例和应用程序实例上都会发出事件。 应用程序实例事件具有相同名称,并以 autocomplete 为前缀。

事件目标参数描述
变更自动完成自动完成,值当自动完成值发生变化时将触发此事件。 返回的 value 是一个包含所选项的数组
autocompleteChange应用程序
打开自动完成自动完成当自动完成开始其打开动画时将触发此事件。 作为参数,事件处理程序接收自动完成实例
autocompleteOpen应用程序
已打开自动完成自动完成当自动完成完成其打开动画后将触发此事件。 作为参数,事件处理程序接收自动完成实例
autocompleteOpened应用程序
关闭自动完成自动完成当自动完成开始其关闭动画时将触发此事件。 作为参数,事件处理程序接收自动完成实例
autocompleteClose应用程序
已关闭自动完成自动完成当自动完成完成其关闭动画后将触发此事件。 作为参数,事件处理程序接收自动完成实例
autocompleteClosed应用程序
beforeDestroy自动完成自动完成此事件将在自动完成实例被销毁之前触发。 作为参数,事件处理程序接收自动完成实例
autocompleteBeforeDestroy应用程序

CSS 变量

以下是相关的CSS 变量(CSS 自定义属性)列表。

请注意,默认情况下未指定注释变量,它们的值是它们在这种情况下回退到的值。

: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);
  */
}
.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-bg-color: #fff;
  --f7-autocomplete-dropdown-text-color: #000;
  --f7-autocomplete-dropdown-text-matching-color: #000;
}
.ios .dark,
.ios.dark {
  --f7-autocomplete-dropdown-bg-color: #1c1c1d;
  --f7-autocomplete-dropdown-text-color: #fff;
  --f7-autocomplete-dropdown-text-matching-color: #fff;
}
.md {
  --f7-autocomplete-dropdown-box-shadow: none;
  --f7-autocomplete-dropdown-text-matching-font-weight: 500;
  --f7-autocomplete-dropdown-text-matching-color: #000;
}
.md .dark,
.md.dark {
  --f7-autocomplete-dropdown-text-matching-color: #fff;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-autocomplete-dropdown-bg-color: var(--f7-md-surface-2);
  --f7-autocomplete-dropdown-text-color: var(--f7-md-on-surface);
}

例子

autocomplete.html
<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="block">
        <p>Dropdown autocomplete is good to use as a quick and simple solution to provide more options in addition to
          free-type value.</p>
      </div>
      <div class="list list-strong-ios list-outline-ios">
        <div class="block-header">Simple Dropdown Autocomplete</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 type="text" placeholder="Fruit" id="autocomplete-dropdown" />
              </div>
            </div>
          </li>
        </ul>
      </div>

      <div class="list list-strong-ios list-outline-ios">
        <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 type="text" placeholder="Fruit" id="autocomplete-dropdown-all" />
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="list list-strong-ios list-outline-ios">
        <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 type="text" placeholder="Fruit" id="autocomplete-dropdown-placeholder" />
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="list list-strong-ios list-outline-ios">
        <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 type="text" placeholder="Fruit" id="autocomplete-dropdown-typeahead" />
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="list list-strong-ios list-outline-ios">
        <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 type="text" placeholder="Language" id="autocomplete-dropdown-ajax" />
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="list list-strong-ios list-outline-ios">
        <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 type="text" placeholder="Language" id="autocomplete-dropdown-ajax-typeahead" />
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Standalone Autocomplete</div>
      <div class="block">
        <p>Standalone autocomplete provides better mobile UX by opening it in a new page or popup. Good to use when you
          need to get strict values without allowing free-type values.</p>
      </div>
      <div class="list list-strong list-outline-ios">
        <div class="block-header">Simple Standalone Autocomplete</div>
        <ul>
          <li>
            <a id="autocomplete-standalone" class="item-link item-content autocomplete-opener">
              <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 list-strong list-outline-ios">
        <div class="block-header">Popup Autocomplete</div>
        <ul>
          <li>
            <a id="autocomplete-standalone-popup" class="item-link item-content autocomplete-opener">
              <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 list-strong list-outline-ios">
        <div class="block-header">Multiple Values</div>
        <ul>
          <li>
            <a id="autocomplete-standalone-multiple" class="item-link item-content autocomplete-opener">
              <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 list-strong list-outline-ios">
        <div class="block-header">With Ajax-Data</div>
        <ul>
          <li>
            <a id="autocomplete-standalone-ajax" class="item-link item-content autocomplete-opener">
              <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, $onMounted, $onBeforeUnmount }) => {
    const fruits = 'Apple Apricot Avocado Banana Melon Orange Peach Pear Pineapple'.split(' ');

    let searchbar;
    let autocompleteDropdownSimple;
    let autocompleteDropdownAll;
    let autocompleteDropdownPlaceholder;
    let autocompleteDropdownTypeahead;
    let autocompleteDropdownAjax;
    let autocompleteDropdownAjaxTypeahead;
    let autocompleteStandaloneSimple;
    let autocompleteStandalonePopup;
    let autocompleteStandaloneMultiple;
    let autocompleteStandaloneAjax;

    $onBeforeUnmount(() => {
      searchbar.destroy();
      autocompleteDropdownSimple.destroy();
      autocompleteDropdownAll.destroy();
      autocompleteDropdownPlaceholder.destroy();
      autocompleteDropdownTypeahead.destroy();
      autocompleteDropdownAjax.destroy();
      autocompleteDropdownAjaxTypeahead.destroy();
      autocompleteStandaloneSimple.destroy();
      autocompleteStandalonePopup.destroy();
      autocompleteStandaloneMultiple.destroy();
      autocompleteStandaloneAjax.destroy();
    })

    $onMounted(() => {
      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 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
          fetch(`./js/autocomplete-languages.json?query=${query}`)
            .then((res) => res.json())
            .then((data) => {
              // Find matched items
              for (let i = 0; i < data.length; i += 1) {
                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
          fetch(`./js/autocomplete-languages.json?query=${query}`)
            .then((res) => res.json())
            .then((data) => {
              // Find matched items
              for (let i = 0; i < data.length; i += 1) {
                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
          fetch(`./js/autocomplete-languages.json?query=${query}`)
            .then((res) => res.json())
            .then((data) => {
              // Find matched items
              for (let i = 0; i < data.length; i += 1) {
                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>