Typeahead.js, как обеспечить более точный поиск и игнорирование специальных символов (скрипт автозаполнения)CSS

Разбираемся в CSS
Ответить Пред. темаСлед. тема
Anonymous
 Typeahead.js, как обеспечить более точный поиск и игнорирование специальных символов (скрипт автозаполнения)

Сообщение Anonymous »

Следуйте приведенной ниже рабочей демонстрации JsFiddle.
У нас есть 2 поля: «по модулю-1» и «по модулю-2»
HTML:

Код: Выделить всё

Módulo 1:



Módulo 2:





Код: Выделить всё

html {
overflow-y: scroll;
*overflow-x: hidden;
}

.container {
max-width: 750px;
margin: 0 auto;
text-align: center;
}

.tt-menu,
.gist {
text-align: left;
}

/* base styles */
/* ----------- */

html {
font: normal normal normal 18px/1.2 "Helvetica Neue", Roboto, "Segoe UI", Calibri, sans-serif;
color: #292f33;
}

a {
color: #03739c;
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

.table-of-contents li {
display: inline-block;
*display: inline;
zoom: 1;
}

.table-of-contents li a {
font-size: 16px;
color: #999;
}

p + p {
margin: 30px 0 0 0;
}

/* site theme */
/* ---------- */

.title {
margin: 20px 0 0 0;
font-size: 64px;
}

.example {
padding: 30px 0;
}

.example-name {
margin: 20px 0;
font-size: 32px;
}

.demo {
position: relative;
*z-index: 1;
margin: 50px 0;
}

.typeahead,
.tt-query,
.tt-hint {
width: 396px;
height: 30px;
padding: 8px 12px;
font-size: 24px;
line-height: 30px;
border: 2px solid #ccc;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
outline: none;
}

.typeahead {
background-color: #fff;
}

.typeahead:focus {
border: 2px solid #0097cf;
}

.tt-query {
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}

.tt-hint {
color: #999
}

.tt-menu {
width: 422px;
margin: 12px 0;
padding: 8px 0;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
box-shadow: 0 5px 10px rgba(0,0,0,.2);
}

.tt-suggestion {
padding: 3px 20px;
font-size: 18px;
line-height: 24px;
}

.tt-suggestion:hover {
cursor: pointer;
color: #fff;
background-color: #0097cf;
}

.tt-suggestion.tt-cursor {
color: #fff;
background-color: #0097cf;

}

.tt-suggestion p {
margin: 0;
}

.gist {
font-size: 14px;
}

/* example specific styles */
/* ----------------------- */

#custom-templates .empty-message {
padding: 5px 10px;
text-align: center;
}

#multiple-datasets .league-name {
margin: 0 20px 5px 20px;
padding: 3px 0;
border-bottom: 1px solid #ccc;
}

#scrollable-dropdown-menu .tt-menu {
max-height: 150px;
overflow-y: auto;
}

#rtl-support .tt-menu {
text-align: right;
}
JavaScript:

Код: Выделить всё

// modulo-1
// ----------
var charMap = {
"à": "a",
"á": "a",
"â": "a",
"é": "e",
"è": "e",
"ê": "e",
"ë": "e",
"É": "e",
"ï": "i",
"î": "i",
"ô": "o",
"ö": "o",
"û": "u",
"ù": "u",
"ü": "u",
"ñ": "n"
};

var names = ["série:Aladdin", "personagem:Naruto","paródia:Dragon Ball Z"];

var normalize = function (input) {
$.each(charMap, function (unnormalizedChar, normalizedChar) {
var regex = new RegExp(unnormalizedChar, 'gi');
input = input.replace(regex, normalizedChar);
});
return input;
};

var queryTokenizer = function (q) {
var normalized = normalize(q);
return Bloodhound.tokenizers.whitespace(normalized);
};

var nombres = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: queryTokenizer,
local: $.map(names, function (name) {
// Normalize the name - use this for searching
var normalized = normalize(name);
return {
value: normalized,
// Include the original name - use this for display purposes
displayValue: name
};
})
});

nombres.initialize();

$('#modulo-1').typeahead({
minLength: 1,
hint: false,
highlight: true
}, {
displayKey: 'displayValue',
source: nombres.ttAdapter()
});

// modulo-2
// ----------
var substringMatcher = function(strs) {
return function findMatches(q, cb) {
var matches, substringRegex;

// an array that will be populated with substring matches
matches = [];

// regex used to determine if a string contains the substring q
substrRegex = new RegExp(q, 'i');

// iterate through the pool of strings and for any string that
// contains the substring q, add it to the matches array
$.each(strs, function(i, str) {
if (substrRegex.test(str)) {
matches.push(str);
}
});

cb(matches);
};
};

var states = ["série:Aladdin", "personagem:Naruto","paródia:Dragon Ball Z"];

$('#modulo-2').typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
name: 'states',
source: substringMatcher(states)
});
https://jsfiddle.net/avcurdgy/2/
В модуле-1 почти так, как я хочу, в нем я могу выполнить поиск по словам «серия» или «серия», и это даст мне нужное значение. Но когда я ищу «Наруто», он ничего не возвращает.
Теперь в «modulo-2», когда я ищу «Наруто», он может найти результат, но не игнорирует акценты, если я ищу «серию», он ничего не возвращает.
Мне нужно, чтобы в модуле-1, когда я ищу «Наруто», он находит результат, как в модуле-2 , я пробовал здесь многое в течение нескольких дней, но безуспешно.
Может ли кто-нибудь мне помочь?
Документация typeahead.js:
https://twitter.github.io/typeahead.js/examples/

Подробнее здесь: https://stackoverflow.com/questions/782 ... characters
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «CSS»