Как я могу очистить ввод typeahead с Jquery? - PullRequest
0 голосов
/ 01 апреля 2020

Часть html в моем тестовом примере:

    <div class="typeahead__container">
         <div class="typeahead__field">
             <div class="typeahead__query">
                  <input class="txtSearchProduct" id="txtSearchProduct" autocomplete="off" tabindex="8">
                  </div>
             </div>
         </div>
    </div>

При использовании этой библиотеки jquery typeahad , вот так ... ( демо здесь)

$.typeahead({
            input: '.txtSearchProduct',
            minLength: 0,
            maxItem: 15,
            order: "asc",
            hint: true,
            href: "",
            searchOnFocus: true,
            emptyTemplate: 'No results found "{{query}}"',
            display: ["id", "code", "name", "table"],
            template: "{{name}}<small style='color:#999;'>{{code}}</small>",
            source: {
                "Products": {
                    ajax: {
                        url: "/search/product",
                        path: ""
                    }
                }
            },
            callback: {
                onClickAfter: function (node, a, item, event) {
                    //debugger;
                    event.preventDefault;
                    //$("#txtSearchProduct").val("");
                    $.ajax({
                        type: "POST",
                        url: "/controller/add/" + item.id,
                        success: function (data) {

                        },
                        error: function (data) {

                        },
                        done: function () {

                            $("#loading").hide();

                        }

                    });
                }
            },

            debug: true
        });

У меня проблемы с очисткой ввода после выбора.

В событии обратного вызова я попытался очистить значение с помощью

$('#txtSearchProduct').typeahead('val', '');

или даже с

$('.typeahead').typeahead('txtSearchProduct', '');

, но любая из этих работ работает как ожидалось. Кажется, что событие, которое возникло при выборе входа, больше не возникает.

Обновление При использовании $("#txtSearchProduct").val("") ввод очищается, но снова он частично работает, если я не нажму на кнопку закрытия.

enter image description here

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Обновление : после более тщательного изучения документации я обнаружил:

Руководство по запуску Typeahead события

Каждый события Typeahead могут контролироваться сценарием, а не только взаимодействием с пользователем. Все они требуют выполнения набора условий. Точные условия можно отследить внутри функции DelegateEvents ().

// Events
'focus.typeahead',
'input.typeahead',
'propertychange.typeahead',
'keydown.typeahead',
'dynamic.typeahead',
'generateOnLoad.typeahead'

// Trigger a manual search from the string inside the input
// See #Game_v3 demo to understand why it is being used at that place
$('#mySearchInput').trigger('input.typeahead');

Документация не является исчерпывающей. В событии propertychange.typeahead нет ничего, кроме его имени и «набора условий для выполнения». Поэтому я все еще не могу сказать с уверенностью 100%, но это также должно работать (работает на демонстрационной странице):

$("#txtSearchProduct").val("")
$("#txtSearchProduct").trigger('propertychange.typeahead');

И это не нарушает инкапсуляцию.


Оригинальный ответ: Я не вижу ничего о вашем деле в документации. Но в исходном коде Typeahead вы можете видеть это:

$("<span/>", {
    class: this.options.selector.cancelButton,
    html: "×",
    mousedown: function (e) {
       // Don't blur the input
       e.stopImmediatePropagation();
       e.preventDefault();

       scope.resetInput();
       scope.node.trigger("input" + scope.namespace, [e]);
    }
}).insertBefore(this.node);

, где scope является Typeahead объектом для ввода. Итак, я попробовал это:

const typeahead_for_input = window.Typeahead[".js-typeahead-country_v1"]

typeahead_for_input.resetInput()
    // clears input and reset some internal variabales

typeahead_for_input.node.trigger("input" + typeahead_for_input.namespace, []) // no event
    // Hides "cancel" button, and maybe a lot more - haven't looked into

в консоли браузера на странице demo , и, насколько я мог заметить, все работало нормально. В вашем случае вы должны получить доступ к Typeahead объекту вашего ввода с помощью этого:

const typeahead_for_input = window.Typeahead[".txtSearchProduct"]

Конечно, этот подход нарушает инкапсуляцию. Но либо это, либо вы должны попросить функцию у авторов от Typeahead и ждать. Поскольку простой очистки входного значения недостаточно - вам необходимо правильно очистить состояние объекта Typeahead.

Другой способ: или вы можете просто имитировать события клавиатуры. Установите фокус на входе и отправьте один <Esc>, который должен это сделать.

1 голос
/ 03 апреля 2020

Убедитесь, что вы включили все HTML точно так же, как в демоверсии, и дайте мне знать, если это то, что вы ищете

Создал демо для вас ниже, чтобы проверить:

$.typeahead({
  input: '.txtSearchProduct',
  minLength: 0,
  maxItem: 15,
  order: "asc",
  hint: true,
  href: "",
  searchOnFocus: true,
  emptyTemplate: 'No results found "{{query}}"',
  display: ["id", "code", "name", "table"],
  template: "{{name}}<small style='color:#999;'>{{code}}</small>",
  source: {
    "Products": {
      ajax: {
        url: "/search/product",
        path: ""
      }
    }
  },
  callback: {
    onClickAfter: function(node, a, item, event) {
      //debugger;
      event.preventDefault;
      //$("#txtSearchProduct").val("");
      $.ajax({
        type: "POST",
        url: "/controller/add/" + item.id,
        success: function(data) {

        },
        error: function(data) {

        },
        done: function() {

          $("#loading").hide();

        }

      });
    }
  },

  debug: true
});
<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-typeahead/2.11.0/jquery.typeahead.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-typeahead/2.11.0/jquery.typeahead.css">

<form>
  <div class="typeahead__container">
    <div class="typeahead__field">
      <div class="typeahead__query">
        <input class="txtSearchProduct" name="q" autofocus autocomplete="off">
      </div>
      <div class="typeahead__button">
        <button type="submit">
                    <span class="typeahead__search-icon"></span>
                </button>
      </div>
    </div>
  </div>
</form>
...