在运行时自动完成搜索栏
问题描述:
我试图在codeigniter中进行自动完成搜索,但问题是当用户在输入字段中写入时第一次打开列表,但没有根据用户输入进行更改。它只在第一时间发生。在运行时自动完成搜索栏
这里是我的代码:
<script>
$(document).ready(function(){
$('#text').keyup(function() {
var min_length = 0;
var keyword = $('#text').val();
if (keyword.length >= min_length) {
$.ajax({
url: 'http://localhost/new/index.php/travels/search_fields',
type: 'POST',
dataType: 'json',
data: { term: $("#text").val()},
success: function(data) {
$.each(data, function() {
$.each(this, function(k, v) {
$("#demo").append("<li>" + v + "</li>");
});
});
}
});
} else {
$('#demo').hide();
}
});
});
</script>
和查询是:
function search_field($country_id){
$this->db->distinct();
$this->db->select("destination");
$this->db->from('travels_detail');
$this->db->like('destination', $country_id);
$query = $this->db->get();
return $query->result();
答
你真的碰到了一些最具挑战性的问题与AJAX在这里,即取消请求的问题以及请求可以以任何顺序完成的事实。
假设用户在搜索字段中键入'123'。然后你会发出三个请求:'1','12'和'123'。
在这个时间点上,您不再对前两个请求的结果感兴趣。然而事实证明,编写正确处理这个问题的代码可能会非常棘手。另一个问题是,这些请求可能会在订单中完成任何订单。例如,假设请求以相反的顺序完成(第3,第2,第1)。那么你可能最终只显示第一个请求的结果,而不是第三个,这是你真正想要的结果。
处理此问题的方法之一就是使用Promises。您可以在该主题here中找到一个很好的介绍。这种问题的一个很好的解决方案是RxJS库。这是一个非常好的库,可以让您将异步集合处理为流。 RxJS存储库中甚至有一个autocomplete example。然而,Rx是一个庞大的函数库和几个新概念的图书馆,最好先开始感受Promise。
- 您可以正确折叠您的代码:)我无法编辑,因为编辑处于待处理状态。 - 2 - 我不确定你的代码在PHP中,你使用哪个数据库? 'like'可能与'%'一起表示字符串没有完成。 '$ this-> db-> like('destination',$ country_id。'%');'你可以console.log得到$ each(data,...)的结果吗?我会帮你的。 '$(“#demo”)。append',所以你追加,你永远不会清除'$('#demo')'? –