2016-06-07 3 views
2

Я пытаюсь понять, что jquery упоминает плагин jquery mentions, и я наткнулся на этот раздел в плагине. Может ли кто-нибудь объяснить, что это значит? Что делает последняя функция возврата? Я хочу, чтобы закрыть автозаполнения раскрывающегося списка, когда соответствует значение имеет длину менее 4JQuery упоминает jquery ui autocomplete

 search: function (value, event) { 
     var match, pos; 
     //&& value.length >= this.options.minChars 
     if (!value) { 
      //sel = window.getSelection(); 
      //node = sel.focusNode; 
      value = this._value(); 
      pos = Selection.get(this.element).start; 
      value = value.substring(0, pos); 
      match = this.matcher.exec(value); 
      if (!match || match[1].length <= this.options.minChars) { 
       return ''; 
      } 

      this.start = match.index; 
      this.end = match.index + match[0].length; 
      this.searchTerm = match[1]; 
      //this._setDropdownPosition(node); 
     } 
     return $.ui.autocomplete.prototype.search.call(this, this.searchTerm, event); 
    } 

ответ

1

Я решил, что, поскольку я узнал, что поисковик не был сброшен, выпадающему не было возвращено нулевое значение. Поэтому я изменил код поиска следующим образом.

search: function (value, event) { 
     var match, pos; 
     //&& value.length >= this.options.minChars 
     if (!value) { 
      //sel = window.getSelection(); 
      //node = sel.focusNode; 
      value = this._value(); 
      pos = Selection.get(this.element).start; 
      value = value.substring(0, pos); 
      match = this.matcher.exec(value); 
      if (!match) { 

       return ''; 
      } 


      this.start = match.index; 
      this.end = match.index + match[0].length; 
      this.searchTerm = match[1]; 
      if (match[1].length <= this.options.minChars) {//customization: to check minChars 

       this.searchTerm = '';// customization: to clear autocomplete dropdown 
      } 
      this._setDropdownPosition($('.mentions')[0]); 
     } 
     return $.ui.autocomplete.prototype.search.call(this,this.searchTerm, event); 
    } 
0

В этом плагине, новые виджеты jQueryUI определены - ui.editablecomplete и ui.areacomplete. Оба этих виджета в основном расширяют обычный виджет autocomplete для поддержки <textarea> элементов и contenteditable элементов.

Всякий раз, когда вы вводите что-либо на входы (<input type="text">, <textarea> и т. Д.), Используется метод поиска. Если он передает все операторы if в методе search, он обрабатывает данные и вызывает последний оператор возврата: $.ui.autocomplete.prototype.search.call(this, this.searchTerm, event);, который в основном сообщает виджету autocomplete, чтобы взять на себя и продолжить все его действия, как обычно. Это может быть аналогично переопределению в классическом наследовании.

В любом случае, если вы хотите открыть раскрывающийся список автозаполнения только для более чем четырех символов, вам необходимо изменить регулярное выражение matcher. По умолчанию это /\B[@]([^@]{0,20})$/, который ограничивает длину ввода от 0 до 20 символов. Я не видел способа изменить его через API, поэтому, я думаю, вам нужно немного изменить код.

Эта функция определяет matcher:

MentionsBase.prototype._getMatcher = function() { 
    var allowedChars; 
    allowedChars = '[^' + this.options.trigger + ']'; 
    return '\\B[' + this.options.trigger + '](' + allowedChars + '{0,20})'; 
}; 

Вы можете изменить {0,20} к {4,20} (или {5,20}, если вы хотите GT и не GTE).

Еще лучшая идея заключается в создании запроса на перенос для автора плагина, который предоставляет регулярное выражение соответствия API, вместо изменения кода.

+0

Спасибо, но я решил эту проблему. :) Теперь я застрял с приведением раскрывающегося списка автозаполнения к курсору в текстовом поле. Я googled и пробовал все решения, но не повезло. – orangespark