Использование HTML в автозаполнении jQuery UI
До jQuery UI 1.8.4 я мог использовать HTML в массиве JSON, который я создал для работы с автозаполнением.
Я был в состоянии сделать что-то вроде:
$row_array['label'] = '<span style="color: red; font-family: courier;">User, Name</span>';
Это будет отображаться как красный текст в раскрывающемся списке.
На 1.8.4 это не работает. Я нашел http://dev.jqueryui.com/ticket/5275 который говорит мне использовать здесь собственный пример HTML, с которым мне не повезло.
Как я могу заставить HTML отображаться в предложении?
Мой JQuery это:
<script type="text/javascript">
$(function() {
$("#findUserIdDisplay").autocomplete({
source: "ui_autocomplete_users_withuname.php",
minLength: 2,
select: function(event, ui) {
$('#findUserId').val(ui.item.id);
}
});
});
</script>
Мой массив JSON включает в себя HTML, как показано ниже:
[{"label":"<span style="color: red";>User, Name</span>","value":"User, Name","id":"10"}]
5 ответов
Добавьте это к своему коду:
).data( "autocomplete" )._renderItem = function( ul, item ) {
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( "<a>"+ item.label + "</a>" )
.appendTo( ul );
};
Итак, ваш код становится:
<script type="text/javascript">
$(function () {
$("#findUserIdDisplay").autocomplete({
source: "ui_autocomplete_users_withuname.php",
minLength: 2,
select: function (event, ui) {
$('#findUserId').val(ui.item.id);
return false;
}
}).data("ui-autocomplete")._renderItem = function (ul, item) {
return $("<li></li>")
.data("item.autocomplete", item)
.append("<a>" + item.label + "</a>")
.appendTo(ul);
};
});
</script>
Примечание. В старых версиях jQueryUI используется .data("autocomplete")"
вместо .data("ui-autocomplete")
Это также задокументировано в документации автозаполнения jquery-ui по адресу: http://api.jqueryui.com/autocomplete/
Хитрость заключается в следующем:
- Используйте это расширение jQuery UI
- Тогда в автозаполнении вариант пройти
autocomplete({ html:true});
- Теперь вы можете передать HTML
<div>sample</div>
в поле "метка" вывода JSON для автозаполнения.
Если вы не знаете, как добавить плагин в JQuery UI, то:
- Сохраните плагин (расширение html Скотта Гонсалеса) в файл js или загрузите файл js.
- Вы уже добавили скрипт автозаполнения jquery-ui на свою html-страницу (или в js-файл jquery-ui). Добавьте этот скрипт плагина после автозаполнения файла javascript.
Это решение не рекомендуется, но вы можете просто отредактировать исходный файл jquery.ui.autocomplete.js (v1.10.4)
Оригинал:
_renderItem:function(t,i){return e("<li>").append(e("<a>").text(i.label)).appendTo(t)},
Исправлена:
_renderItem:function(t,i){return e("<li>").append(e("<a>").html(i.label)).appendTo(t)},
У меня была та же проблема, но я предпочитаю использовать статический массив опций для моей опции ('source') для производительности. Если вы попробовали это с этим решением, вы обнаружите, что jQuery также выполняет поиск по всей метке.
Например, если вы предоставили:
[{"label":"<span style="color: red";>User, Name</span>","value":"User, Name","id":"10"}]
Затем ввод "span" будет соответствовать обоим результатам, чтобы он выполнял поиск только по значению, переопределяя $.ui.autocomplete.filter
функция:
$.ui.autocomplete.filter = function(a,b){var g=new RegExp($.ui.autocomplete.escapeRegex(b),"i");return $.grep(a,function(c){return g.test(c.value||c)})}
Вы можете редактировать последний параметр c.value
на что угодно, например c.id || c.label || c.value
позволит вам искать по метке, значению или идентификатору.
Вы можете указать столько ключей / значений для параметра источника автозаполнения, сколько хотите.
PS: оригинальный параметр c.label||c.value||c
,
У меня была проблема, упомянутая Кларенсом. Мне нужно было предоставить HTML, чтобы красиво выглядеть со стилями и изображениями. Это привело к вводу "div", совпадающему со всеми элементами.
Однако моим значением был только идентификационный номер, поэтому я не мог позволить, чтобы поиск выполнялся только из этого. Мне нужно было искать несколько значений, а не только идентификационный номер.
Мое решение состояло в том, чтобы добавить новое поле, содержащее только значения поиска, и проверить это в файле пользовательского интерфейса jQuery. Вот что я сделал:
(Это на jQuery UI 1.9.2; на других может быть то же самое.)
Редактировать функцию фильтра в строке 6008:
filter: function (array, term) {
var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
return $.grep(array, function (value) {
if (value.searchonly == null)
return matcher.test(value.label || value.value || value);
else
return matcher.test(value.searchonly);
});
}
Я добавил проверку для поля "value.searchonly". Если он есть, он использует только это поле. Если его там нет, он работает как обычно.
Затем вы используете автозаполнение точно так же, как и раньше, за исключением того, что вы можете добавить ключ "searchonly" к вашему объекту JSON.
Я надеюсь, что это помогает кому-то!