你怎麼能得到「結果」事件,當「多」設置爲true火災和用戶類型的不屬於現有列表的條目?在我的測試頁面中,我無法做到。
無論如何,我通過自動完成插件源代碼進行調試,發現它不處理您有'多重= 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方法的樣子。它試圖獲得當前選定的值。 這裏select對象是插件創建的'autocomplete'下拉列表。 如果用戶輸入了不屬於該列表的單詞,它將返回false,並且'結果'事件不會觸發。
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;
}
所以,你可以修改你的自動完成插件的版本或獲取文本框的值,做解析自己。
不幸的是,event.target.value只是完整的內容文本框。如果我打算使用它,我可以完全繞過所有這些代碼並嘗試分割$('#txtbox')。val();但我希望能夠使用自動完成中已有的代碼在顯示值和ID之間進行映射。 – Clyde 2009-06-29 15:06:20