Как вы можете заставить срабатывать событие result, когда для параметра multiple установлено значение true и пользователь вводит запись, которой нет в существующем списке? На моей тестовой странице я не смог этого сделать.
В любом случае, я отлаживал исходный код плагина автозаполнения и обнаружил, что он не обрабатывает сценарий, в котором у вас есть «multiple = true», «mustmatch = false» и типы пользователей в записи, которая не принадлежит вашему списку автозаполнения.
Вот отладочная информация:
Существует код, который проверяет нажатие клавиши пользователем, если это ЗАПЯТАЯ или ваш multipleSeparator, он запускает метод selectCurrent ().
// matches also semicolon
case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
case KEY.TAB:
case KEY.RETURN:
if( selectCurrent() ) {
// stop default to prevent a form submit, Opera needs special handling
event.preventDefault();
blockSubmit = true;
return false;
}
break;
Так выглядит метод selectCurrent. Он пытается получить текущее выбранное значение. Здесь объект выбора - это раскрывающийся список «автозаполнение», созданный плагином. Если пользователь ввел слово, которого нет в списке, возвращается false, и событие result не срабатывает.
function selectCurrent() {
var selected = select.selected();
if( !selected ) //selected is NULL if user types in comma after typing a word which doesn't belong in the list. And that is why I was surprised that your result event was even triggered.
return false;
var v = selected.result;
previousValue = v;
if ( options.multiple ) {
var words = trimWords($input.val());
if ( words.length > 1 ) {
v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
}
v += options.multipleSeparator;
}
$input.val(v);
hideResultsNow();
$input.trigger("result", [selected.data, selected.value]);
return true;
}
Чтобы исправить это, вы должны проверить options.multiple. Вот последний код, который все сделает правильно:
function getLastWord()
{
var words = trimWords($input.val());
return words[words.length - 1];
};
function selectCurrent() {
var selected = select.selected();
//options.multiple BUGFIX START
//We don't have to check for options.mustMatch because the 'select' component
//already handles it.
if(! selected && options.multiple)
{
var lastWord = getLastWord();
//Below code is similar to how the Cache component generates the data.
selected = {
data : lastWord,
value : options.formatMatch(lastWord, -1, options.data.length),
result : options.formatResult && options.formatResult(lastWord) || lastWord
};
}
//options.multiple BUGFIX END
if( !selected )
return false;
var v = selected.result;
previousValue = v;
if ( options.multiple ) {
var words = trimWords($input.val());
if ( words.length > 1 ) {
v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
}
v += options.multipleSeparator;
}
$input.val(v);
hideResultsNow();
$input.trigger("result", [selected.data, selected.value]);
return true;
}
Таким образом, вы можете изменить свою версию плагина Autocomplete или получить значение текстового поля и выполнить синтаксический анализ самостоятельно.
person
SolutionYogi
schedule
15.07.2009