Автозаполнение в середине текста (например, Google Plus)
Существует множество вариантов для автозаполнения. Большинство из них, похоже, работают с первыми буквами, которые напечатаны.
В программе Google Plus опция автозаполнения вскоре упадет после ввода @
, независимо от того, где она встречается в поле формы, и использует буквы, следующие за @
, для руководства автозаполнением. (Это также выглядит неплохо!)
Кто-нибудь делил код, чтобы делать такие вещи?
Есть ли у кого-нибудь какие-либо указатели на попытку реализовать игрушечную версию этого (например, в jQuery)?
Ответы
Ответ 1
Это возможно с помощью jQueryUI автозаполнения виджета. В частности, вы можете адаптировать эту демонстрацию, чтобы удовлетворить ваши требования. Вот пример:
function split(val) {
return val.split(/@\s*/);
}
function extractLast(term) {
return split(term).pop();
}
var availableTags = [ ... ]; // Your local data source.
$("#tags")
// don't navigate away from the field on tab when selecting an item
.bind("keydown", function(event) {
if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
event.preventDefault();
}
}).autocomplete({
minLength: 0,
source: function(request, response) {
var term = request.term,
results = [];
if (term.indexOf("@") >= 0) {
term = extractLast(request.term);
if (term.length > 0) {
results = $.ui.autocomplete.filter(
availableTags, term);
}
}
response(results);
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function(event, ui) {
var terms = split(this.value);
// remove the current input
terms.pop();
// add the selected item
terms.push(ui.item.value);
// add placeholder to get the comma-and-space at the end
terms.push("");
this.value = terms.join("");
return false;
}
});
И здесь он работает: http://jsfiddle.net/UdUrk/
Сообщите мне, нужна ли вам дополнительная информация (например, как заставить ее работать с удаленным источником данных).
Обновление: Здесь приведен пример использования удаленного источника данных (StackOverflow API): http://jsfiddle.net/LHNky/. Он также включает пользовательский показ предложений автозаполнения.
Ответ 2
Я написал плагин jQuery, основанный на функциональности автозаполнения jQuery UI. Вот мое решение:
http://www.hawkee.com/snippet/9391/
Вы называете это следующим образом:
$('#inputbox').triggeredAutocomplete({
hidden: '#hidden_inputbox',
source: "/search.php",
trigger: "@"
});
Ответ 3
вы можете использовать событие автозаполнения, чтобы определить, есть ли в нем текст @.
Если это не @, просто верните false, и автозаполнение не будет работать.
например: $ ( ".selector" ).autocomplete({ search: function (event, ui) {...}
});
Ответ 4
Я написал для этого загрузочный плагин. Он работает независимо от того, где @встречается в поле формы. Это для ContentEditable divs, а не для текстовой области: http://sandglaz.github.com/bootstrap-tagautocomplete/
Ответ 5
Чтобы ускорить ответ Эндрю Уиттэкера, параметр source
jQuery UI Autocomplete используется для указания массива, содержащего элементы, которые должны отображаться в раскрывающемся списке после запуска виджета. Его можно определить как такой массив, функцию, которая возвращает такой массив, или URL-адрес ресурса, который создает такой массив.
Если source
определяется как функция, параметры функции request
и response
могут использоваться, чтобы помочь составить его возвращаемый массив и передать его виджету, соответственно. request
в особенности вас интересует, так как его член term
содержит значение элемента ввода, к которому прикреплен виджет, во время вызова функции.
Посмотрите, где я собираюсь? Его довольно простой, проанализируйте request.term
для текста между интересующим знаком @
и курсором и используйте этот текст для создания массива для подачи на виджет. Однако вам нужно сделать небольшую работу (или использовать некоторые готовые функции), чтобы можно было уверенно находить курсор в совместимом с кросс-браузером образом.
Проверьте Mentionator, если вы ищете существующий подключаемый модуль, который обеспечивает те функции, которые вы пытаетесь подражать. Он хорошо структурирован, прост в использовании и прокомментирован, поэтому вам не составит труда понять, как использовать подход, который я описал. Он также поддерживается вашим поистине:).