Ну вот и готова предрелизная версия mSearch2. Мы должны ее дружно потетстировать, поправить баги и получится стабильная версия.
В принципе, теперь я воплотил все свои (и не только свои) хотелки. У нас добавилось управление словарями прямо в вдминке и автодополнение.
Со словарями всё просто - при установке дополнения сразу загружаются 2 словаря: русский и английский. Если вам нужно добавить или удалить словарь, для этого появился новый раздел в админке.
В индексации участвуют все установленные словари, ничего настраивать не нужно. При загрузке словаря вы можете выбрать зеркало SourceForge, чтобы качать с ближайшего к вам сервера.
Но все вопросы решены и теперь у нас есть новый сниппет mSearchForm . Вот его параметры:
Первый самый интересный - он ищет точно так же как и сниппет mSearch2, получает id совпадений и передаёт их в указанный сниппет. А сниппет может быть любым, главное, чтобы он понимал параметр &resources
.
Заодно сниппету будут переданы все параметры, указанные при вызове mSearchForm - очень похоже на работу mFilter2 с пагинатором.
Таким образом, вы можете указать чанки, подключение ТВ, таблиц, картинок товаров и чего угодно. Так как этот режим сразу выводит точное совпадение, при выборе результата вы отправитесь на конечную страницу - вам нечего искать, вы уже нашли.
Понятно, можно не кликать, а жать enter и будет поиск по тому, что вы набрали, без подсказок. Конечно, все теги в чанках выполняются. Например, мне очень нравится вызывать в них pdoCrumbs .
А второй режим попроще - он просто смотрит таблицу запросов, которая появилась в прошлой версии, и выводит совпадения из неё. Выводит, понятно, только те, что с результатами. Потому, что от дополнения «ккккувпусм» толку никакого не будет (вы бы видели, что у меня на сайте ищут).
Само дополнение работает на
jQuery UI Autocomplete — Использование виджета автозаполнения
5 (100%) 3 votesВ этом уроке мы подробно рассмотрим виджет Autocomplete (Автозаполнения) в jQuery UI. Этот плагин позволяет облегчить ручной ввод информации в текстовые поля формы. По мере ввода символов в input, пользователю предлагаются варианты автоматического заполнения текстовых полей. Этот виджет позволяет избежать ошибок ввода и делает приложению или сайт более дружелюбным и простым для ваших пользователей. Ниже посмотрим, как можно создать, настроить и использовать виджет/плагин Autocomplete.
Подготовительные работыДля работы с библиотекой jQuery UI нам нужно скачать библиотеку jQuery и jQuery UI, и создать небольшой проект. Я подключаю библиотеку jQuery с сервера CDN, а jQuery UI можете скачать отсюда .
Структура нашего проекта будет иметь такой вид: Создал папку с названием «project», внутри него есть две папки и один HTML файл
В HTML файле нам нужно подключить все необходимые библиотеки и файлы:
jQuery UI
Создание виджета AutocompleteПосле подготовительных работ мы можем приступать к созданию Autocomplete виджета. Для создание элемента автозаполнения библиотека jQuery UI представляет метод .autocomplete() , который нужно вызвать для текстового инпута.
HTML — index.html:
Форма поиска:
jQuery — scripts/main.js:
$(function() { var myArray = ["Человек", "самые популярные", "Мини-словарик"]; $("#myInput").autocomplete({ source: myArray }); });
Открываем в браузере файл index.html, и в текстовом поле начинаем вводить символы. В итоге, автозаполнение уже у нас работает.
Метод autocomplete принимает в качестве параметра объект с опциями. Один из опции этого объекта — это source. В качестве значение опции source нужно передать источник, из которого нужно взять данные для автозаполнения. В нашем примере мы передаем простой массив строк.
Нужно помнить, что виджет Autocomplete не проверяет правильность введенных данных. То есть, несмотря на то, что мы определить нужные значение для опции source, пользователь может вводить любые другие значение в текстовом поле.
Заметьте, что массив данных сортируется автоматически. Это за нас делает библиотека jQuery UI. Кроме того, что он за нас сортирует массив данных, он может эти данные для автозаполнения получить из разных источников.
Использование массива объектов в качестве источника данных для AutocompleteМы можем передать массив объектов в качестве данных для автозаполнения текстовых полей. Данный метод позволяет отделить значение, которое видна в раскрывающемся списке, от значение которое нужно подставить в текстовое поле.
$(function() { var myArray = [ {"label": "Кармен Электра", "value": "Кармен"}, {"label": "Николас Кейдж", "value": "Николас"}, {"label": "Оливия Уайлд", "value": "Оливия"}, {"label": "Рассел Кроу", "value": "Кроу"} ]; $("#myInput").autocomplete({ source: myArray }); });
В объекте ключи label и value обязательны , потому что, при использование массива объектов, библиотека автоматически ищет ключи label и value. В качестве значение свойства label нужно указать текст, который будет отображаться в выпадающем списке, а в качестве значение ключа value нужно указать текст, который будет введен в текстовое поле после выбора из выпадающего списка.
Настройка виджета AutocompleteВиджет автозаполнения jQuery UI имеет несколько свойств, с помощью которых мы можем его настроить. Ниже представлен список этих свойств.
Опция source может принимать данные для раскрывающегося списка автозаполнения из самых разных источников. То есть, кроме примеров, которые я показал выше, мы можем эти данные получить из сервера или из другого сайта. Как и из нашего сервера (back-end), так и из другого источника мы ожидаем только данные в виде массива (может быть в формате JSON). Для получение данные с сервера нужно просто указать URL адрес в качестве значения ключа source.
$(function() { $("#myInput").autocomplete({ source: "https://site.ru/api/search?key=Hello" }); });
Код выше не будет работать, это просто пример использование.
В этом случае, как только мы начинаем вводить символы в поле input, виджет автоматически будет выполнять HTTP GET запросы по этому адресу, чтобы получить список данных с сервера.
Автозаполнение форм - это функция, которая позволяет автоматически вводить в формах на сайтах личную информацию, например ваше имя, адрес, электронную почту или телефон. По умолчанию в Яндекс.Браузере автозаполнение включено .
Автозаполнение удобно, но, чтобы подставить ваши данные в формы, браузеру нужно хранить их на компьютере. Если на компьютер проникнет вредоносное ПО, злоумышленник может украсть ваши данные. А если во время вашего отсутствия посторонний человек откроет браузер, он сможет авторизоваться на сайтах под вашим именем или узнать ваши данные другим способом. Поэтому, если для вас безопасность ваших данных намного важнее удобства, возможно, вам стоит отключить автозаполнение.
Внимание. Если вы хотите, чтобы данные автозаполнения на конкретном сайте не сохранялись в браузере, используйте режим Инкогнито . При необходимости вы можете отключить автозаполнение форм в браузере.
При первом вводе информации в форму (например, адреса или номера телефона) браузер запоминает ее. При повторном вводе в поле появляется список, из которого можно выбрать ранее сохраненный вариант автозаполнения.
Задать данные автозаполнения вручную Удалить данные автозаполнения Отключить автозаполнение форм Автозаполнение поискового запросаЗапросы в «Умной строке» браузера
По умолчанию в браузере сохраняется история запросов. При повторном вводе они выделяются точкой справа.
","hasTopCallout":true,"hasBottomCallout":false,"areas":[{"shape":"circle","direction":["top","right"],"alt":"Сохраненный поисковой запрос","coords":,"isNumeric":false,"hasTopCallout":true,"hasBottomCallout":false}]}}\">
Чтобы удалить сохраненные в браузере поисковые запросы:
Запросы в поисковой строке ЯндексаЕсли вы авторизованы в Яндексе, то ваши запросы сохраняются по умолчанию – при повторном вводе они будут выделены фиолетовым. Кроме этого, сайты, на которые вы часто заходите, отображаются первыми в списке поисковых подсказок.
Disclaimer (Attention detected!)
Сразу заявляю, что ни один из существующий, а также фреймворков будущего, и близко не стоит рядом с $mol. Я ни в коем случае не утверждаю, что какой-либо иной фреймворк круче чем $mol, потому что с $mol просто невозможно соревноваться в крутости. Это самый крутой фреймворк из когда-либо созданных человечеством. Уверен именно $mol спасет мир!Итак, задача сделать переиспользуемый микро-компонент автодополнения с поддержкой асинхронной подгрузки списка вариантов. Иными словами, начинаем ввод искомого значения - выпадает список вариантов, который может задаваться как статически (некий массив), а так и подгружаться динамически с сервера.
Собственно сам svelte-компонент может выглядеть так:
{{#await suggestions}}
{{then options}}
{{#each options as option}}
{{ option }}
{{/each}}
{{/await}}
export default {
data: () => ({
search: "",
suggestions:
})
};
Ремарка
Внимательный читатель сразу заметит своеобразный «life-hack», который тут присутствует. А именно использование html5-тега , который фактически и создавался для подобных вещей, однако до сих пор имеет слабую поддержку браузерами .
Хочу отметить, что использую его здесь чисто в демонстрационных целях, чтобы визуально упростить код для лучшего понимания, а также потому что конкретная реализация выпадающего списка не является целью статьи. Переделать список с на
Обратите внимание на {{#await /}} в шаблоне. Именно эта простая конструкция позволяет нам не беспокоиться является ли переменная «suggestions» реальным массивом или же это промис, который будет разрешен в массив.
Здесь пожалуй все, теперь перейдем к использованию:
Selected location: {{ location }}
import Autocomplete from "./Autocomplete.html"
import { fetchLocations } from "./api.js"
export default {
data: () => ({
location: ""
}),
computed: {
locations: location => {
return location.length >= 3 ? fetchLocations(location) :
}
},
components: {
Autocomplete
}
};
Это некий родительский компонент, который реализует domain-логику конкретного кейса. В данном случае - это выбор локации (города).
Сначала подключается компонент автодополнения, а также некий модуль, реализующий взаимодействие с серверным API. У нас также есть переменная «location», куда мы собственно сохраняем выбранное значение. Она биндится на «search» из компонента автокомплита через props, а также выводится неким результирующим значением чуть выше.
Далее интересный момент. Так как Svelte поддерживает вывод асинхронных значений через {{#await /}}, а также вычисляемые свойства (computed props), которые могут зависеть от других данным, мы можем написать супер простое вычисляемое свойство для получения списка вариантов с сервера и подвязать его на изменение «location». Т.е. когда пользователь вводит значение в поле, реактивная переменная «location» изменяется, что приводит к пересчету вычисляемого свойства «locations». Данное свойство также биндится на «suggestions» из компонента автокомплита через props. И все работает как «магия»))))
Отмечу также, что для того, чтобы пример работал хорошо, необходима реализация метода debounce, чтобы не завалить сервер лишними запросами. В данном случае, подразумевается, что debounce уже реализуется внутри функции fetchLocations(), потому как он не имеет прямого отношения к примеру.
Вот так вот, супер просто можно реализовать переиспользуемый микро-компонент автодополнения на Svelte.
Далее, так как к предыдущей статетье про Svelte было задано много вопросов, касающихся принципа работы Svelte, AoT-компиляции svelte-компонентов и вероятным дублированием кода. Представляю вольный перевод вот этого комментария создателя Svelte Рича Харриса (Rich Harris):
Это хороший вопрос. Я бы ответил на него несколькими способами:Однако, считаю что он прекрасно занимает нишу небольших (виджеты и т.п.) и средних проектов (мобильные и ТВ приложения и т.п.). В таких проектах Svelte несомненно обеспечивает меньший размер бандла и большую скорость работы. Если для вас это актуально, вам стоит познакомиться с ним поближе.
Всем хороших выходных! И да прибудет с вами Сила пятницы!
UPDATE:
Для тех, кто обеспокоен дублированием кода в Svelte. Есть новая информация непосредственно от Рича Харриса. Мой комментарий на эту тему можно прочитать
В данном уроке мы рассмотрим один из новых компонентов jQuery UI 1.8 - виджет Autocomplete. Автозаполнение полей формы может быть очень полезной функцией для посетителей вашего сайта, так как она облегчает ввод информации. Такую функцию можно использовать, например, для поля, или при вводе страны, города, или чего либо подобного, что можно выбрать из общего списка. Виджет jQuery UI Autocomplete популярен у разработчиков, так как его легко использовать, он достаточно мощный и гибкий.
Одним из свойств Facebook является отправка сообщений друзьям. Автозаполнение используется при вводе имени друга. В данном уроке мы будем использовать виджет jQuery UI Autocomplete для создания системы, подобной той, которая используется при отправке сообщений в Facebook. Конечно, отправку сообщения реализовывать не будем. Вот что должно получиться в итоге:
Шаг 1 Getting StartedНужно построить пользовательскую загрузку jQuery UI, которая будет содержать только нужные компоненты. Переходим на страницу построения загрузки на http://jqueryui.com/download . Нам нужно использовать только следующие компоненты:
Нужно использовать тему по умолчанию (UI Lightness) и убедиться в том, что выбрана версия 1.8 в колонке справа.
Шаг 2 Разметка HTMLСначала посмотрим на :
Новое сообщение Новое сообщение Кому: Тема: Сообщение: Отменить Отправить
Это обычная стандартная форма. Внешний контейнер используется для задания стилей, а элемент , к которому будет присоединяться Autocomplete, также находится внутри элемента . Стиль для задается так, что он немного скрыт, а стиль придает ему вид, схожий с остальными полями формы. Контейнеру придается класс ui-helper-clearfix , чтобы использовать данный класс из CSS рабочей среды jQuery UI.
Следующие файлы должны присоединяться в конце раздела :
Шаг 3 Стили для формы
Мы используем очень простую нейтральную тему в нашем примере. Следующий код CSS содержится в файле autocomplete.css (все стили jQuery UI устанавливаются в файле jquery-ui-1.8.custom.css ):
#formWrap { padding:10px; position:absolute; float:left; background-color:#000; background:rgba(0,0,0,.5); -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; } #messageForm { width:326px; border:1px solid #666; background-color:#eee; } #messageForm fieldset { padding:0; margin:0; position:relative; border:none; background-color:#eee; } #messageForm legend { visibility:hidden; height:0; } #messageForm span { display:block; width:326px; padding:10px 0; margin:0 0 20px; text-indent:20px; background-color:#bbb; border-bottom:1px solid #333; font:18px Georgia, Serif; color:#fff; } #friends { width:274px; padding:3px 3px 0; margin:0 auto; border:1px solid #aaa; background-color:#fff; cursor:text; } #messageForm #to { width:30px; margin:0 0 2px 0; padding:0 0 3px; position:relative; top:0; float:left; border:none; } #messageForm input, #messageForm textarea { display:block; width:274px; padding:3px; margin:0 auto 20px; border:1px solid #aaa; } #messageForm label { display:block; margin:20px 0 3px; text-indent:22px; font:bold 11px Verdana, Sans-serif; color:#666; } #messageForm #toLabel { margin-top:0; } #messageForm button { float:right; margin:0 0 20px 0; } #messageForm #cancel { margin-right:20px; } #friends span { display:block; margin:0 3px 3px 0; padding:3px 20px 4px 8px; position:relative; float:left; background-color:#eee; border:1px solid #333; -moz-border-radius:7px; -webkit-border-radius:7px; border-radius:7px; color:#333; font:normal 11px Verdana, Sans-serif; } #friends span a { position:absolute; right:8px; top:2px; color:#666; font:bold 12px Verdana, Sans-serif; text-decoration:none; } #friends span a:hover { color:#ff0000; } .ui-menu .ui-menu-item { white-space:nowrap; padding:0 10px 0 0; }
Для придания форме чудесных прозрачных границ с закругленными углами используется правила CSS3 rgba , -moz-border-radius , -webkit-border-radius и border-radius . IE не поддерживает ни одного их данных правил, и, хотя можно использовать фильтр для воспроизведения зачатка прозрачности, скругленные углы можно сделать только с использованием изображений. Эффективность прозрачности RGBa не проявляется в данном примере в полной силе. Вероятно, что данный тип формы будет использоваться как плавающее модальное окно поверх контента страницы.
Контейнер , содержащий поле , к которому будет присоединяться Autocomplete, получает такое же положение и стиль как элемент , но сам элемент внутри контейнера скрывается. Также мы уменьшаем его размеры и сдвигаем влево. Для того, чтобы при добавлении отформатированного имени получателя в , не переполнялось и не нужно было увеличивать высоту .
Также мы задаем стиль для имени получателя, которое будет добавляться к , как элемент , содержащий ссылку. В основном стиль соответствует теме и имеет также скругленные углы. Важно, что данные элементы имеют блочную структуру и плавают, так что они заполняются правильно. Также нужно переписать некоторые стили Automcomplete, задаваемые в используемой теме jQuery UI.
Форма должна иметь следующий вид:
Шаг 4 Присоединяем AutocompleteТеперь нужно присоединить виджет Autocomplete к внутри . Для этого используется следующий скрипт:
$(function(){ //Присоединяем автозаполнение $("#to").autocomplete({ //Определяем обратный вызов к результатам форматирования source: function(req, add){ //Передаём запрос на сервер $.getJSON("friends.php?callback=?", req, function(data) { //Создаем массив для объектов ответа var suggestions = ; //Обрабатываем ответ $.each(data, function(i, val){ suggestions.push(val.name); }); //Передаем массив обратному вызову add(suggestions); }); }, //Определяем обработчик селектора select: function(e, ui) { //Создаем форматированную переменную friend var friend = ui.item.value, span = $("").text(friend), a = $("").addClass("remove").attr({ href: "javascript:", title: "Remove " + friend }).text("x").appendTo(span); //Добавляем friend к div friend span.insertBefore("#to"); }, //Определяем обработчик выбора change: function() { //Сохраняем поле "Кому" без изменений и в правильной позиции $("#to").val("").css("top", 2); } }); });
Виджет присоединяется к с помощью метода autocomplete() . объект передается литерально как аргумент метода, который конфигурирует опцию source и возвратные функции событий select и change .
Опция source используется для указания источника предложения для меню Autocomplete. Мы используем функцию, как значение для данной опции, которая принимает два аргумента. Первый является термином, введенным в , а второй - возвратной функцией, которая используется для передачи предложений обратно виджету.
В данной функции мы используем метод jQuery getJSON() для передачи термина в PHP файл на стороне сервера. Файл PHP использует термин для извлечения похожих имен контакта из базы данных MySql. Мы используем JSONP для возвращения полученных данных обратно процессу. Возвратная функция, которая передается как второй аргумент опции source, предполагает получение данных в массиве. Таким образом нужно создать пустой массив и использовать метод jQuery each() для обработки каждого пункта массива JSON, который возвращается сервером. Итерация совершается над каждым пунктом в массиве и добавляет каждое предложение в новый массив. Как только новый массив будет построен, мы передаем его возвратной функции для вывода виджетом в меню.
Затем определяется обработчик для события select Autocomplete. Данная функция выполняется виджетом каждый раз, когда предложение выделяется в меню Autocomplete. Данная функция автоматически получает два аргумента - объект события и объект ui, который содержит выбранное предложение. Мы используем данную функцию для форматирования имени получателя и добавления его в . Просто создается элемент для текста и элемента ссылки, которая используется для удаления получателя. Как только форматированное имя получателя будет создано, оно вставляется прямо перед закамуфлированным .
Затем мы добавляем обработчик события change. Данная функция будет вызвана при изменениях значения , с которым ассоциирован Autocomplete. Мы просто удаляем значение из , потому что мы уже добавляли форматированную версию в контейнер .
Это вся конфигурация, которая нужна для конкретного применения, но есть еще пара функций, которые нужны для придания аккуратности коду. После метода autocomplete() добавим следующий код:
//Добавляем обработчки события click для div friends $("#friends").click(function(){ //Фокусируемся на поле "Кому" $("#to").focus(); }); //Добавляем обработчик для события click удаленным ссылкам $(".remove", document.getElementById("friends")).live("click", function(){ //Удаляем текущее поле $(this).parent().remove(); //Корректируем положение поля "Кому" if($("#friends span").length === 0) { $("#to").css("top", 0); } });
, к которому прикреплен наш Autocomplete, практически скрыт и контейнер имеет стиль, который делает его похожим на другие поля формы. Для завершения обмана мы добавляем обработчик события click контейнеру , таким образом нажатие клавиши мыши где-угодно на нем фокусирует действительный . Теперь визуально и функционально не отличается от обычного поля.
Также нужно обрабатывать событие click на ссылке, которая добавляется для каждого форматированного имени получателя. Мы используем метод jQuery live() потому, что данный элемент может и не существовать на странице в заданное время, и такой подход проще, чем привязывание функции обработчика каждый раз, когда создается ссылка. Когда бы не была нажат ссылка, все что нужно сделать, это перейти к родителю ссылки и затем удалить ее со страницы. Нужно проверить, удалены ли все имена получателей, и если это так, то сбросить положение к значению по умолчанию.
Шаг 5 Дополнительный код и ресурсыДля хранения списка всех имен получателей используется база данных MySql. Следующий файл PHP получает данные, отправленные методом getJSON() и вытаскивает соответствующие имена получателей из базы данных:
Для запуска примера нужен веб сервер с установленным и сконфигурированным PHP, а также сервер MySql и соответствующая база данных и таблица. Когда символ вводится в поле ‘Кому’, он передается на сревер и используется для вытаскивания из базы данных каждого имени, которое начинается с введенного символа. Подходящие имена затем передаются обратно на страницу и выводятся в меню предложений:
ЗаключениеНаша форма в действительности ничего никуда не отправляет. Функционал легко реализовать с помощью обработки события, привязанного к кнопке "Отправить".
Виджет jQuery UI Autocomplete делает простым соединение с любым источником данных и содержит богатый функционал для обработки событий, которые мы можем использовать для того, чтобы реагировать на ввод текста в ассоциированное поле или выбор предложения из меню. Виджет стилизуется с использованием рабочей среды CSS jQuery UI и может легко быть настроен на то, чтобы соответствовать теме сайта. В целом, описанный виджет очень легок в использовании и обеспечивает отличный функционал.