barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 19 июля 2012 г.

Виджет jQuery UI autocomplete и поиск по value, а не по label

Если элементы для автодополнения являются объектами и содержат и поле value, и поле label, то при фильтрации элементов для автодополнения виджет autocomplete использует label. Такой вариант недопустим если, например, label был специально обрезан, чтобы слишком не растягивать список подсказок. В данном случае фильтровать элементы нужно по value. 
Чтобы исправить ситуацию, нужно переопределить функцию jQuery.ui.autocomplete.filter:
jQuery.ui.autocomplete.filter = function(array, term) {
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
return $.grep( array, function(value) {
return matcher.test(value.value || value.label || value );
});
(в оригинале value.value и value.label идут в обратном порядке)

2 комментария:

  1. что за матчер.тест? и что его параметры означают, не очень понятно.
    Заранее спасибо.

    капча ад

    ОтветитьУдалить
    Ответы
    1. matcher.test() проверяет, что его параметр соответствует регулярному выражению matcher, которое было создано ранее. А в параметре в matcher.test() передается либо value элемента списка (если оно не пусто), либо его label, либо, если и value, и label пусты - тогда просто сам элемент списка (последний вариант сработает, если список составлен просто из значений, а не из объектов с полями label И value).
      PS Всегда пожалуйста, будут ещё вопросы - пишите. Можно тут, можно на aspirin.spb@gmail.com

      Удалить