jQuery Chosen 避免中文搜尋時,按下 Enter 立刻就完成的狀況

Written by Simon Asika on

jQuery Chosen 很好用,尤其是清單過長時的搜尋功能。

不過中文輸入時會有個問題(最起碼Mac會),當我們輸入完一個中文字並出現要選擇的欄位時,此時輸入法會停留在可選字狀態,一旦我按下 Enter 想要確認選字,Chosen 會偵測到 Enter 鍵,因此就自動選了第一個項目。

130614-0002.jpg

解決方法很簡單,我們在搜尋時,別讓 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 不會有問題。

Control Tools

WS-logo