Почему jquery textcomplete после первого набора слов не может найти другие слова правильно? - PullRequest
0 голосов
/ 23 мая 2018

Я использую jquery-textcomplete для моей текстовой области.Это некорректная работа.Например, первым шагом я наберу слово apple, а после добавления пробела и второго способа добавлю слово app, и этот сценарий или автозаполнение не может найти слово apple.Зачем?Как это исправить?Для тестирования запустите snipped и напишите слово app и покажите слова app и apple.Выберите слово apple, затем добавьте пробел, затем добавьте также слово app, и слова не будут отображаться.Затем после app добавьте appe и посмотрите результат.

$('#textcomplete').textcomplete([{
  words: ['тоҷик', 'оҷиз', 'ҷило', 'тоҷ', 'тоҷикистон', 'apple', 'please', 'app', 'perl', 'person', 'erlan'],
  match: /(^|\S*)([^\u0000-\u007f]{2,}|\w{2,})$/,
  search: function(term, callback) {
    callback($.map(this.words, function(word) {
      if (word.indexOf(term.toLocaleLowerCase()) !== 0)
        return null;

      if (term[term.length-1] === term[term.length-1].toLocaleUpperCase())
        return word.toLocaleUpperCase(); // last char is upper = uppercase
      if (term[0] === term[0].toLocaleUpperCase())
        return word.charAt(0).toLocaleUpperCase() + word.slice(1); // first char is upper = capitalized
        
      return word; // default; is lowercase
    }));
  },
  index: 2,
  replace: function(word) {
    return word + ' ';
  }
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.textcomplete/1.8.4/jquery.textcomplete.min.js"></script>

<textarea id="textcomplete"></textarea>

1 Ответ

0 голосов
/ 23 мая 2018

Новый ответ

Не думаю, что начало вашего регулярного выражения необходимо.
Поправьте меня, если я ошибаюсь, но работает следующее:

$('#textcomplete').textcomplete([{
  words: ['тоҷик', 'оҷиз', 'ҷило', 'тоҷ', 'тоҷикистон', 'apple', 'please', 'app', 'perl', 'person', 'erlan'].sort(), // TAKIT: sort array
  match: /([^\u0000-\u007f]{2,}|\w{2,})$/, // TAKIT: modified here
  search: function(term, callback) {
    callback($.map(this.words, function(word) {
      if (word.indexOf(term.toLocaleLowerCase()) !== 0)
        return null;

      if (term[term.length-1] === term[term.length-1].toLocaleUpperCase())
        return word.toLocaleUpperCase(); // last char is upper = uppercase
      if (term[0] === term[0].toLocaleUpperCase())
        return word.charAt(0).toLocaleUpperCase() + word.slice(1); // first char is upper = capitalized
        
      return word; // default; is lowercase
    }));
  },
  index: 1, // TAKIT: modified here
  replace: function(word) {
    return word + ' ';
  }
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.textcomplete/1.8.4/jquery.textcomplete.min.js"></script>

<textarea id="textcomplete"></textarea>

Старый ответ

(не работает с символами Юникода)

Поскольку я вообще не являюсь экспертом по RegEx, я признаю, что не совсем понимаю, в чем проблема.
В любом случае ... Я использовал метасимвол \b, который соответствует "границе слова" в регулярном выражении.из ^|\S*.
Это должно было быть только упрощением, но проблема, похоже, больше не возникает с ним:

$('#textcomplete').textcomplete([{
  words: ['тоҷик', 'оҷиз', 'ҷило', 'тоҷ', 'тоҷикистон', 'apple', 'please', 'app', 'perl', 'person', 'erlan'],
  match: /(\b)([^\u0000-\u007f]{2,}|\w{2,})$/,
  search: function(term, callback) {
    callback($.map(this.words, function(word) {
      if (word.indexOf(term.toLocaleLowerCase()) !== 0)
        return null;

      if (term[term.length-1] === term[term.length-1].toLocaleUpperCase())
        return word.toLocaleUpperCase(); // last char is upper = uppercase
      if (term[0] === term[0].toLocaleUpperCase())
        return word.charAt(0).toLocaleUpperCase() + word.slice(1); // first char is upper = capitalized
        
      return word; // default; is lowercase
    }));
  },
  index: 2,
  replace: function(word) {
    return word + ' ';
  }
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.textcomplete/1.8.4/jquery.textcomplete.min.js"></script>

<textarea id="textcomplete"></textarea>

Надеюсь, это поможет.

...