jQuery Автозаполнение, разные источники в зависимости от того, какой символ был введен - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть текстовое поле, к которому я добавил автозаполнение. Но это проблема, я хочу иметь возможность использовать значение, отличное от объекта, в зависимости от того, введены скобки или нет. Проблема в том, что мне нужно создать что-то вроде State(County). Я выбираю штат (эта часть работает нормально), но затем мне нужно выбрать округ после ввода (, он ничего не делает, нет ошибок или ничего. enter image description here

enter image description here

Это мой код:

  $(function() {
     $("document").ready(function() {

    var states = [
        { 'state': "New York", 'county': '1' },
        { 'state': "New York", 'county': '1a' },
        { 'state': "New York", 'county': '1b' },
        { 'state': "Florida", 'county': '2' },
        { 'state': "Florida", 'county': '2a' },
        { 'state': "Florida", 'county': '2b' },
        { 'state': "Florida", 'county': '3' },
        { 'state': "Alaska", 'county': '4' },
        { 'state': "Alaska", 'county': '5' },
        { 'state': "Hawaii", 'county': '6' },
        { 'state': "Hawaii", 'county': '7' },
        { 'state': "Maine", 'county': '8' },
        { 'state': "Maine", 'county': '9' },
        { 'state': "Maine", 'county': '10' }
    ];
function split(val) {
  return val.split(/,\s*/);
}

function extractLast(term) {
  return split(term).pop();
}

$('#text').on('keypress', function(e) {
  theKeyCode = e.which;

  // if (e.which !== 40) { // I tried this too ------------
  if (String.fromCharCode(e.which) !== '(') { // Just trying something different

    $(e.target)
      .autocomplete({
        minLength: 0,
        autoFocus: true,
        source: function(request, response) {
          var lastEntry = extractLast(request.term);
          var filteredArray = $.map(states, function(item) {
            if (item.state.indexOf(lastEntry) === 0) {
              return item.state;

            } else {
              return null;
            }
          });
          response($.ui.autocomplete.filter(filteredArray, lastEntry));
        },
        focus: function() {
          return false;
        },
        select: function(event, ui) {
          var terms = split(this.value);
          terms.pop();
          terms.push(ui.item.value);
          terms.push("");
          this.value = terms.join("");

          return false;
        }
      }).on("keydown", function(event) {
        if (event.keyCode === $.ui.keyCode.TAB /** && $(this).data("ui-autocomplete").menu.active **/ ) {
          event.preventDefault();
          return;
        }
        var newY = $(this).textareaHelper('caretPos').top + (parseInt($(this).css('font-size'), 10) * 1.5);
        var newX = $(this).textareaHelper('caretPos').left;
        var posString = "left+" + newX + "px top+" + newY + "px";
        $(this).autocomplete("option", "position", {
          my: "left top",
          at: posString
        });
      });
  } else {

    console.log(e.which); //This shows the right e.which
    $('#text').autocomplete("destroy"); // Just experimenting. It doesn't work with or without it
    $(e.target)
      .autocomplete({
        minLength: 0,
        autoFocus: true,
        source: function(request, response) {
          var lastEntry = extractLast(request.term);
          var filteredArray = $.map(states, function(item) {
            if (item.county.indexOf(lastEntry) === 0) {
              return item.county;
            } else {
              return null;
            }
          });
          response($.ui.autocomplete.filter(filteredArray, lastEntry));
        },
        focus: function() {
          return false;
        },
        select: function(event, ui) {
          var terms = split(this.value);
          terms.pop();
          terms.push(ui.item.value);
          terms.push("");
          this.value = terms.join("), ");
          return false;
        }
      }).on("keydown", function(event) {
        if (event.keyCode === $.ui.keyCode.TAB) {
          event.preventDefault();
          return;
        }
        var newY = $(this).textareaHelper('caretPos').top + (parseInt($(this).css('font-size'), 10) * 1.5);
        var newX = $(this).textareaHelper('caretPos').left;
        var posString = "left+" + newX + "px top+" + newY + "px";
        $(this).autocomplete("option", "position", {
          my: "left top",
          at: posString
        });
      });
  } //e.preventDefault();
});



 });
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...