Typeahead insensitive accent

前端 未结 3 486
悲哀的现实
悲哀的现实 2020-12-04 02:37

I tried this solution but I got this error :

Uncaught ReferenceError: normalized is not defined

Here is my code :



        
3条回答
  •  青春惊慌失措
    2020-12-04 02:56

    If you do not want to use Bloodhound, you can customize both 'highlighter' and 'matcher' methods from Typeahead object so they become accent insensitive.

    If you want to make accent insensitive the default behavior of typeahead, you can include a new JavaScript file like below:

    Step 1 - create a new file 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, '$&');
    }
    

    Step 2 - add to your page after bootstrap3-typeahead.min.js

    
    
    

    Of course you must be aware that since you are replacing both methods you should monitor if new features released in typeahead won't be reflected in your customized methods. However, I think this a lightweight and quick solution.

    PS.: this is my first contribution to Stack Overflow hope you enjoy it!

提交回复
热议问题