Выделите несколько ключевых слов для jQuery.autocomplete - PullRequest
5 голосов
/ 05 июня 2009

Я использую плагин jQuery Автозаполнение , но у меня есть некоторые проблемы с выделением результатов. Когда совпадение найдено, но введенное ключевое слово содержит пробелы, подсветка отсутствует. Пример:

search = "foo", result = "foo bar", отображается = " foo bar"

search = "foo ba", result = "foo bar", отображается = "foo bar"

Итак, я пытаюсь это исправить, используя опцию highlight функции автозаполнения, где вы можете использовать функцию для выполнения каких-либо пользовательских действий с результатами. В настоящее время у меня есть это:

<code>$('.autocomplete').autocomplete('getmatch.php', {
    highlight: function(match, keywords) {
        keywords = keywords.split(' ').join('|');
        return match.replace(/(get|keywords|here)/gi,'<b>$1</b>');
    }
});

Функция замены заменяет все совпадающие слова в строке жирным шрифтом, что работает. Тем не менее, я не знаю, как получить ключевые слова в эту функцию. Я думал, что разделю их, а затем присоединю к ним с помощью '|', так что "foo bar" будет выглядеть как "foo | bar". Но что-то вроде этого не работает:

return match.replace(/(keywords)/gi,'<b>$1</b>'); // seen as text, I think

return match.replace('/'+(keywords)+'/gi','<b>$1</b>'); // nothing either

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 05 июня 2009

Используйте конструктор RegExp для создания RegExp объекта из строки:

$('.autocomplete').autocomplete('getmatch.php', {
    highlight: function(match, keywords) {
        keywords = keywords.split(' ').join('|');
        return match.replace(new RegExp("("+keywords+")", "gi"),'<b>$1</b>');
    }
});
1 голос
/ 28 сентября 2009

Я настроил первоначальную реализацию автозаполнения, так как вышеприведенное упрощено и не будет иметь дело со специальными символами regEx в этом термине.

function doTheHighlight(value, term) {
    // Escape any regexy type characters so they don't bugger up the other reg ex
    term = term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1");

    // Join the terms with a pipe as an 'OR'
    term = term.split(' ').join('|');

    return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
}
0 голосов
/ 05 июня 2009

Ваша функция должна использовать эту сигнатуру: функция (значение, термин). Значение и термин будут заполнены плагином автозаполнения и будут иметь нужные значения.

...