jQuery Chosen 很好用,尤其是清單過長時的搜尋功能。
不過中文輸入時會有個問題(最起碼Mac會),當我們輸入完一個中文字並出現要選擇的欄位時,此時輸入法會停留在可選字狀態,一旦我按下 Enter 想要確認選字,Chosen 會偵測到 Enter 鍵,因此就自動選了第一個項目。
解決方法很簡單,我們在搜尋時,別讓 Chosen 自動高亮搜尋出來的第一個項目,這樣當按下 Enter 時,Chosen 就不會有任何動作,我們可以開開心心的選字,然後再用方向鍵選擇想要的項目。
修改方法如下,大概在 993 行左右,把這一段程式碼:
函式名稱:winnow_results_set_highlight
Chosen.prototype.winnow_results_set_highlight = function() {
var do_high, selected_results;
if (!this.result_highlight) {
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
if (do_high != null) {
return this.result_do_highlight(do_high);
}
}
};
改成
Chosen.prototype.winnow_results_set_highlight = function() {
var do_high, selected_results;
if (!this.result_highlight) {
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
do_high = selected_results.length ? selected_results.first() : null;
if (do_high != null) {
return this.result_do_highlight(do_high);
}
}
};
即可。
2018.01.11 更新
改用 keyup 事件來偵測會更有效,首先要理解,注音輸入法的 Enter 選字時,只會觸發 keyup 事件,不會觸發 keydown 事件。偏偏 Chosen 是用 keyup 來選擇搜尋結果的,因此按下選字時自然就會觸發選擇結果的功能。我們只要把選擇結果的事件移動到 keydown 即可。
在 chosen.js
內,你可以用 13
來搜尋 (Enter 的編碼),有兩處使用到這個編碼。首先 433 行是 keyup 事件:
case 13:
evt.preventDefault();
if (this.results_showing) {
return this.result_select(evt);
}
break;
註解掉 this.result_select(evt)
case 13:
evt.preventDefault();
if (this.results_showing) {
// return this.result_select(evt);
}
break;
接著 1186 行是 keydown 事件:
case 13:
if (this.results_showing) {
evt.preventDefault();
}
break;
加上 this.result_select(evt)
:
case 13:
if (this.results_showing) {
evt.preventDefault();
return this.result_select(evt);
}
break;
現在你可以正常的選字,然後再選擇搜尋結果了,按兩次 Enter 不會有問題。