自动完成
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 选择器)。自动完成元素。
方法返回自动完成实例
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) {
...
}
});
自动完成参数
让我们看一下所有可用参数的列表
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
openIn | 字符串 | 页面 | 定义如何打开自动完成,可以是 page 或 popup (对于独立)或 dropdown |
source | 函数 (query, render) | 接受搜索 query 和 render 函数的函数,您需要在其中传递带有匹配项的数组 | |
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 |
view | object | 如果要使用独立自动完成,请链接到已初始化的 View 实例。 默认情况下,如果未指定,它将在主视图中打开。 | |
下拉自动完成参数 | |||
inputEl | 字符串 HTMLElement | 包含相关文本输入的 CSS 选择器或 HTMLElement 的字符串 | |
inputEvents | 字符串 | input | 允许配置用于处理自动完成操作和源请求的输入事件。 例如,如果您使用带有中文组合的键盘,则可以更改为 change keyup compositionend |
highlightMatches | 布尔值 | true | 突出显示自动完成结果中的匹配项 |
typeahead | 布尔值 | false | 启用提前输入,将使用匹配项中的第一项预先填充输入值 |
dropdownPlaceholderText | 字符串 | 指定下拉占位符文本 | |
updateInputValueOnSelect | 布尔值 | true | 如果为 true ,则相关输入的值也将更新 |
dropdownContainerEl | 字符串 HTMLElement | 默认情况下,下拉菜单将添加到父页面内容元素。 您可以在此处指定添加下拉元素的不同元素 | |
渲染函数 | |||
renderDropdown | function(items) | 用于渲染自动完成下拉列表的函数,必须返回下拉列表 HTML 字符串 | |
renderPage | function(items) | 用于渲染自动完成页面的函数,必须返回页面 HTML 字符串 | |
renderPopup | function(items) | 用于渲染自动完成弹出窗口的函数,必须返回弹出窗口 HTML 字符串 | |
renderItem | function(item, index) | 用于渲染单个自动完成项的函数,必须返回项目 HTML 字符串 | |
renderSearchbar | function | 用于渲染搜索栏的函数,必须返回搜索栏 HTML 字符串 | |
renderNavbar | function | 用于渲染导航栏的函数,必须返回导航栏 HTML 字符串 | |
事件 | |||
on | object | 包含事件处理程序的对象。 例如
|
请注意,以下所有参数都可以在 autocomplete
属性下的全局应用程序参数中使用,以为所有自动完成项设置默认值。 例如
var app = new Framework7({
autocomplete: {
openIn: 'popup',
animate: false,
}
});
自动完成方法和属性
初始化 Autocomplete 后,我们会在变量(如上面的 autocomplete
变量)中获得其初始化实例,其中包含有用的方法和属性
属性 | |
---|---|
autocomplete.params | 包含传递的初始化参数的对象 |
autocomplete.value | 包含所选项目的数组 |
autocomplete.opened | 如果 Autocomplete 当前已打开,则为 true |
autocomplete.openerEl | Autocomplete 打开器元素的 HTML 元素(如果在初始化时传递) |
autocomplete.$openerEl | Autocomplete 打开器元素的 Dom7 实例(如果在初始化时传递) |
autocomplete.inputEl | Autocomplete 输入的 HTML 元素(如果在初始化时传递) |
autocomplete.$inputEl | Autocomplete 输入的 Dom7 实例(如果在初始化时传递) |
autocomplete.$dropdownEl | Autocomplete 下拉列表的 Dom7 实例 |
autocomplete.url | Autocomplete URL(在 url 参数中传递) |
autocomplete.view | Autocomplete 视图(在 view 参数中传递)或找到的父视图 |
autocomplete.el | Autocomplete 容器的 HTML 元素:下拉元素、弹出元素或页面元素。 在 Autocomplete 打开时可用 |
autocomplete.$el | Autocomplete 容器的 Dom7 实例:下拉元素、弹出元素或页面元素。 在 Autocomplete 打开时可用 |
autocomplete.searchbar | Autocomplete 页面 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>