Нечувствительный акцент

Я пробовал это решение, но получил эту ошибку:

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()
}) ;

где моя ошибка? Спасибо


person youcef    schedule 17.03.2014    source источник
comment
переменная normalized не определена в области действия функции normalize. Я полагаю, вы хотите вернуть переменную str в эту функцию.   -  person Will P.    schedule 17.03.2014


Ответы (3)


Измените функцию нормализации, чтобы она возвращала нормализованную строку, т.е.

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/

Вы можете увидеть нормализованную строку в консоли отладки браузера. В моем примере "ааааееууу" преобразуется в "аааеееууу".

Обратите внимание, что я изменил параметры функции, чтобы они были более точными (т. е. chars — это неправильно, должно быть char), а также рационализировал регулярное выражение.

person Ben Smith    schedule 19.03.2014

Если вы не хотите использовать Bloodhound, вы можете настроить методы «подсветки» и «сопоставления» из объекта 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, надеюсь, вам понравится!

person Vitor Siqueira    schedule 06.02.2016

Вы можете использовать String.prototype.normalize()

https://developer.mozilla.org/en-%5BUS/docs/Web/JavaScript/Reference/Global_Objects/String/normalize%5D%5B1%5D

var queryTokenizer = function(input) {
        input = input.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
        return Bloodhound.tokenizers.whitespace(input);
};
person Ivan Valadares    schedule 06.10.2020