自动完成预输入搜索,使用 ajax 调用疑难解答

Autocomplete typeahead search, using ajax calls troubleshooting

提问人:Dova Kin 提问时间:11/5/2023 最后编辑:isherwoodDova Kin 更新时间:11/7/2023 访问量:50

问:

我正在尝试使用文本输入作为搜索框,使用引导预输入插件通过ajax调用检索搜索结果

<form class="form-inline ml-3" action="/phone-autocomplete/">
    <div class="input-group input-group-sm">
        <input class="form-control form-control-navbar typeahead" data-provide="typeahead" autocomplete="off"
         id="phone-autocomplete" type="search" name="searchstring" placeholder="search phone" aria-label="Search">
        <div class="input-group-append">
            <button class="btn btn-navbar" type="submit">
                <i class="fas fa-search"></i>
            </button>
        </div>
    </div>
</form>

我的数据源返回一个文本/xml 响应,如下所示:

[ "9876124", "9812124","9875124",] 

我的javascript,在包含所有必需的包后,如下:

    $('#phone-autocomplete').typeahead({
        source: function (query, process) {
            return $.get('/phone-autocomplete/', { searchstring: query }, function (data) {
                console.log(data);
                return process(data);
            });
            
        },
        'updater' : function(item) {
            this.$element[0].value = item;
            console.log(item);
            this.$element[0].form.submit();
            return item;
        }
    });
      
</script> 

其目的是让搜索输入在用户每次键入字符时发送请求,并返回更新的项目列表

我遇到的问题是它仅适用于一位数字,然后由于某种原因停止显示

这是使用 bootstrap3-typeahead.min.js 包

谢谢

jquery ajax twitter-bootstrap bootstrap-4 bootstrap-typeahead

评论

0赞 KIKO Software 11/5/2023
我认为原因可能是在更新程序中?你为什么要在那里提交?但是,我没有完全重建您的代码,所以我不能确定。form.submit();
0赞 Dova Kin 11/5/2023
我的印象是我需要提交将新关键字发送到远程页面,以便返回“找到”项目的更新列表。无论如何,我都尝试删除那条线,但它并不能解决问题

答:

0赞 user2314737 11/5/2023 #1

您的 Ajax 调用一定有问题,因为似乎在搜索框中键入的每个字符都在更新,请参阅演示:typeahead

//
$('#phone-autocomplete').typeahead({
  source: function(query, process) {
    data = ["9876124", "9812124", "9875124", ];
    console.log(`Ajax call with query: ${query}`);
    return process(data);
  },
  'updater': function(item) {
    this.$element[0].value = item;
    console.log(item);
    this.$element[0].form.submit();
    return item;
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script>

<form class="form-inline ml-3" action="/phone-autocomplete/">
  <div class="input-group input-group-sm">
    <input class="form-control form-control-navbar typeahead" data-provide="typeahead" autocomplete="off" id="phone-autocomplete" type="search" name="searchstring" placeholder="search phone" aria-label="Search">
    <div class="input-group-append">
      <button class="btn btn-navbar" type="submit">
                <i class="fas fa-search"></i>
            </button>
    </div>
  </div>
</form>

下面是一个演示,展示了如何从 Ajax 调用获取输出(注意:我将 Ajax 设置为 )。asyncfalse

请参见:https://api.jquery.com/jQuery.get/

//
$.ajaxSetup({
  async: false,
});
$('#phone-autocomplete').typeahead({
  source: function(query, process) {
    console.log(`Ajax call with query: ${query}`);
    var data = [];
    $.get("example.php", function(data) {
        //alert("success");
      })
      .done(function() {
        //alert("second success");
      })
      .fail(function() {
        //alert("error");
      })
      .always(function() {
        //alert("finished");
        data = ["9876124", "9812124", "9875124", ];
        console.log(`data = ${data}`);
      });
    return process(data);
  },
  'updater': function(item) {
    this.$element[0].value = item;
    console.log(item);
    this.$element[0].form.submit();
    return item;
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-3-typeahead/4.0.2/bootstrap3-typeahead.min.js"></script>

<form class="form-inline ml-3" action="/phone-autocomplete/">
  <div class="input-group input-group-sm">
    <input class="form-control form-control-navbar typeahead" data-provide="typeahead" autocomplete="off" id="phone-autocomplete" type="search" name="searchstring" placeholder="search phone" aria-label="Search">
    <div class="input-group-append">
      <button class="btn btn-navbar" type="submit">
                <i class="fas fa-search"></i>
            </button>
    </div>
  </div>
</form>

你只需要删除这些线条

data = ["9876124", "9812124", "9875124", ];
console.log(`data = ${data}`);

并从回调函数中填充。 希望这有帮助!alwaysdatadone

评论

0赞 Dova Kin 11/6/2023
我将如何在完成的回调中填充数据?这很奇怪,因为当我手动访问我的数据提供程序 URL 时,它会返回您硬编码的相同数组。我将如何“捕获”get 请求并将其分配给 done 回调中的数据?
0赞 Dova Kin 11/6/2023
没关系,它是MIME类型,如果它没有设置为JSON,它就不起作用!无论如何,谢谢!
0赞 Dova Kin 11/6/2023 #2

我解决了, 显然,将远程响应的 MIME 类型设置为 application/json 至关重要,输出文本字符串或 HTML 不起作用并且静默失败

评论

0赞 user2314737 11/6/2023
也许添加一个回调,这样它就不会静默失败?fail()