Нечувствительный к акценту акцент
Я пробовал это решение, но я получил эту ошибку:
Uncaught ReferenceError: нормализовано не определено
Вот мой код:
var charMap = {
"à": "a", "â": "a", "é": "e", "è": "e", "ê": "e", "ë": "e",
"ï": "i", "î": "i", "ô": "o", "ö": "o", "û": "u", "ù": "u"
};
var normalize = function(str) {
$.each(charMap, function(chars, normalized) {
var regex = new RegExp('[' + chars + ']', 'gi');
str = str.replace(regex, normalized);
});
return normalized;
}
var queryTokenizer = function(q) {
var normalized = normalize(q);
return Bloodhound.tokenizers.whitespace(normalized);
};
var spectacles = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: queryTokenizer,
prefetch:'spectacles.json',
limit:10,
});
spectacles.initialize();
$('#search').typeahead({
minLength: 1,
hint:false,
highlight: true
},
{
name: 'spectacles',
displayKey: 'value',
source: spectacles.ttAdapter()
}) ;
где моя ошибка? Спасибо
2 ответа
Измените вашу функцию нормализации так, чтобы она возвращала нормализованную строку, т.е.
var normalize = function (input) {
$.each(charMap, function (unnormalizedChar, normalizedChar) {
var regex = new RegExp(unnormalizedChar, 'gi');
input = input.replace(regex, normalizedChar);
});
return input;
}
Посмотрите эту скрипку, которую я написал, чтобы увидеть, как она работает:
http://jsfiddle.net/Fresh/SL36H/
Вы можете увидеть нормализованную строку в консоли отладки браузера. В моем примере "àààèèè converted" преобразуется в "aaaeeeuuu".
Обратите внимание, что я изменил параметры функции, чтобы они были более точными (т. Е. Chars неверен, это должен быть char), и я также рационализировал регулярное выражение.
Если вы не хотите использовать Bloodhound, вы можете настроить оба метода 'highlighter' и 'matcher' из объекта Typeahead, чтобы они стали нечувствительными к акценту.
Если вы хотите сделать нечувствительным к акценту поведение по умолчанию для typeahead, вы можете включить новый файл JavaScript, как показано ниже:
Шаг 1 - создайте новый файл bootstrap3-typeahead-ci.min.js
// function for making a string accent insensitive
$.fn.typeahead.Constructor.prototype.normalize = function (str) {
// escape chars
var normalized = str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
// map equivalent chars
normalized = normalized.replace(/[aãáàâ]/gi, '[aãáàâ]');
normalized = normalized.replace(/[eẽéèê]/gi, '[eẽéèê]');
normalized = normalized.replace(/[iĩíìî]/gi, '[iĩíìî]');
normalized = normalized.replace(/[oõóòô]/gi, '[oõóòô]');
normalized = normalized.replace(/[uũúùû]/gi, '[uũúùû]');
normalized = normalized.replace(/[cç]/gi, '[cç]');
// convert string to a regular expression
// with case insensitive mode
normalized = new RegExp(normalized, 'gi');
// return regular expresion
return normalized;
}
// change 'matcher' method so it became accent insensitive
$.fn.typeahead.Constructor.prototype.matcher = function (item) {
// get item to be evaluated
var source = this.displayText(item);
// make search value case insensitive
var normalized = this.normalize(this.query);
// search for normalized value
return source.match(normalized);
}
// change 'highlighter' method so it became accent insensitive
$.fn.typeahead.Constructor.prototype.highlighter = function (item) {
// get html output
var source = this.displayText(item);
// make search value case insensitive
var normalized = this.normalize(this.query);
// highlight normalized value in bold
return source.replace(normalized, '<strong>$&</strong>');
}
Шаг 2 - добавьте на свою страницу после bootstrap3-typeahead.min.js
<script src="bootstrap3-typeahead.min.js"></script>
<script src="bootstrap3-typeahead-ci.min.js"></script>
Конечно, вы должны знать, что, поскольку вы заменяете оба метода, вы должны следить за тем, чтобы новые функции, выпущенные в typeahead, не отражались в ваших пользовательских методах. Тем не менее, я думаю, что это легкое и быстрое решение.
PS: это мой первый вклад в Stack Overflow, надеюсь, вам понравится!
Вы можете использовать String.prototype.normalize()
var queryTokenizer = function(input) {
input = input.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
return Bloodhound.tokenizers.whitespace(input);
};