2015-08-20 2 views
4

Я использую typeahead.js для автозавершения, как и в this official example.Выделите несколько слов, используя Typeahead.js

Когда я ищу «rh», это приводит к «Rh ode Island» (соответствующие символы являются высокопоставленными).

Когда я ищу «rh is», это приводит к «Rhode Island» (без подсветки). Как я могу заставить это работать? Ожидаемый результат: «Rh ode Is земля».

P.S. Если это требует изменений в source code, тогда для меня это нормально.

+0

возможно дубликат вопроса [здесь] [1] [1]: http://stackoverflow.com/questions/12662824/twitter-bootstrap-typeahead-multiple-value –

+0

Спасибо. Но ссылка для компонента typeahead перед загрузкой v2.3, и, возможно, нет соответствующих функций для переопределения в Typeahead.js. –

ответ

4

Интегрированный компонент подсветки typeahead по умолчанию не является достаточно большим, чтобы соответствовать вашим требованиям.

Я даю вам пример с mark.js, текстовым ярлыком для поисковых терминов/ключевых слов или пользовательских регулярных выражений. Посетите веб-сайт, чтобы узнать больше об API.

DEMO JSFIDDLE

$(function() { 
 
    // constructs the suggestion engine 
 
    var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 
 
    'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 
 
    'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 
 
    'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 
 
    'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 
 
    'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 
 
    'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 
 
    'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 
 
    'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming', 'take bag' 
 
    ]; 
 
    var states = new Bloodhound({ 
 
    datumTokenizer: Bloodhound.tokenizers.whitespace, 
 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
 
    // `states` is an array of state names defined in "The Basics" 
 
    local: states 
 
    }); 
 

 
    // Initialize typeahead with mark.js 
 
    var $context = $("#bloodhound"); 
 
    $context.find(".typeahead").typeahead({ 
 
    hint: true, 
 
    // disable integrated typeahead component 
 
    highlight: false, 
 
    minLength: 1 
 
    }, { 
 
    name: 'states', 
 
    source: states 
 
    }).on("typeahead:render", function() { 
 
    // highlight matches with mark.js 
 
    var searchTerm = $(this).val(); 
 
    $context.find(".tt-menu").mark(searchTerm); 
 
    }); 
 
});
input { 
 
    width: 250px; 
 
    padding: 3px; 
 
} 
 

 
mark { 
 
    background: yellow; 
 
    color: black; 
 
}
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script> 
 
<script src="https://cdn.rawgit.com/julmot/mark.js/6.1.0/dist/jquery.mark.min.js"></script> 
 
<script src="https://cdn.rawgit.com/twitter/typeahead.js/v0.11.1/dist/typeahead.bundle.min.js"></script> 
 
<!-- Demo taken from http://twitter.github.io/typeahead.js/examples/ --> 
 
<div id="bloodhound"> 
 
    <input class="typeahead" type="text" placeholder="States of USA. Type in 'rh is' or 'bag take'"> 
 
</div>

Во-первых, вам придется отключить по умолчанию интегрированный компонент (по умолчанию отключено) подсветка. Затем вам нужно будет прослушать событие рендеринга и инициализировать mark.js по предложениям typeahead.

+0

Отличный ответ! Это именно то, что я искал. Еще один вопрос: когда я набираю «a», он выделяет все а в Алабаме. Можно ли выделить только первый а? – compie

+0

Спасибо! В настоящее время невозможно ограничить основные моменты определенным количеством совпадений. Но, к счастью, другой пользователь (или вы?) Запросил ту же функцию несколько часов назад, см. [Эту проблему в GitHub] (https://github.com/julmot/mark.js/issues/35). Поэтому, если вы хотите, чтобы этот вариант был реализован, примите участие. – dude

+0

Однако вы всегда можете проверить 'searchTerm' на« a »и не инициализировать mark.js в этом случае. – dude

-1

Я думаю, что если вы добавите \s шаблон регулярному выражению, используемому в _.escapeRegExChars() хелпер (см. here), он решит вашу проблему.

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