javascript - 如何克隆 JavaScript 自动完成输入字段

标签 javascript jquery html css

我遇到了一个自动完成的机场搜索脚本。它位于:

https://codepen.io/jessegavin/pen/ALpOvr

输入域是:

<div class="form-group">
  <label class="control-label">Enter an Airport</label>
  <input id="autocomplete" type="text" />
</div>

实际的 JavaScript 代码是:

var options = {
  shouldSort: true,
  threshold: 0.4,
  maxPatternLength: 32,
  keys: [{
    name: 'iata',
    weight: 0.5
  }, {
    name: 'name',
    weight: 0.3
  }, {
    name: 'city',
    weight: 0.2
  }]
};

var fuse = new Fuse(airports, options)


var ac = $('#autocomplete')
  .on('click', function(e) {
    e.stopPropagation();
  })
  .on('focus keyup', search)
  .on('keydown', onKeyDown);

var wrap = $('<div>')
  .addClass('autocomplete-wrapper')
  .insertBefore(ac)
  .append(ac);

var list = $('<div>')
  .addClass('autocomplete-results')
  .on('click', '.autocomplete-result', function(e) {
    e.preventDefault();
    e.stopPropagation();
    selectIndex($(this).data('index'));
  })
  .appendTo(wrap);

$(document)
  .on('mouseover', '.autocomplete-result', function(e) {
    var index = parseInt($(this).data('index'), 10);
    if (!isNaN(index)) {
      list.attr('data-highlight', index);
    }
  })
  .on('click', clearResults);

function clearResults() {
  results = [];
  numResults = 0;
  list.empty();
}

function selectIndex(index) {
  if (results.length >= index + 1) {
    ac.val(results[index].iata);
    clearResults();
  }  
}

var results = [];
var numResults = 0;
var selectedIndex = -1;

function search(e) {
  if (e.which === 38 || e.which === 13 || e.which === 40) {
    return;
  }

  if (ac.val().length > 0) {
    results = _.take(fuse.search(ac.val()), 7);
    numResults = results.length;

    var divs = results.map(function(r, i) {
        return '<div class="autocomplete-result" data-index="'+ i +'">'
             + '<div><b>'+ r.iata +'</b> - '+ r.name +'</div>'
             + '<div class="autocomplete-location">'+ r.city +', '+ r.country +'</div>'
             + '</div>';
     });

    selectedIndex = -1;
    list.html(divs.join(''))
      .attr('data-highlight', selectedIndex);

  } else {
    numResults = 0;
    list.empty();
  }
}

function onKeyDown(e) {
  switch(e.which) {
    case 38: // up
      selectedIndex--;
      if (selectedIndex <= -1) {
        selectedIndex = -1;
      }
      list.attr('data-highlight', selectedIndex);
      break;
    case 13: // enter
      selectIndex(selectedIndex);
      break;
    case 9: // enter
      selectIndex(selectedIndex);
      e.stopPropagation();
      return;
    case 40: // down
      selectedIndex++;
      if (selectedIndex >= numResults) {
        selectedIndex = numResults-1;
      }
      list.attr('data-highlight', selectedIndex);
      break;

    default: return; // exit this handler for other keys
  }
  e.stopPropagation();
  e.preventDefault(); // prevent the default action (scroll / move caret)
}

它适用于单个输入字段。但是,如果我添加第二个字段,它会失败。我的想法是在一个表单中添加两个搜索字段。一个用于起点,一个用于目的地机场。有没有一种简单的方法可以用上面的代码实现这一点?

谢谢!

最佳答案

您选择的组件需要进一步的代码修复才能使其适用于多个实例。我建议你看看JQuery UI Autocomplete小部件,它可以完美地完成您的工作,并且适用于多个实例。

关于javascript - 如何克隆 JavaScript 自动完成输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47482960/

相关文章:

php sql 将 ID 和文本导入 testarea,然后在对文本进行更改后发布这两个值

html - 车高度度低于容器

javascript - Electron 版Firebase Electron 邮件/密码身份验证

javascript - 单击下拉列表重定向到另一个页面

javascript - 我如何通过 $.ajax 调用使用成功函数

jquery - HTML 和 CSS 下拉框及其旁边的文本框

javascript - Jquery.each数组推送不起作用?

html - 响应式网页设计 + SCSS 站点组织

javascript - 如何通过 jQuery 滑动切换下拉菜单项?

javascript(嵌入在 HTML 中) document.createElement ("canvas")未在浏览器中显示