我得到了一个ajax实时搜索脚本,它在数据库中搜索名称。我的问题是,我使用keyup();
,所以每次按下输入字段内的一个键,php脚本再次被触发。这将导致输出被刷新多次(取决于搜索的单词有多少个字符)。
所以我添加了一个300毫秒的计时器,但这在开始键入时太慢了。我的解决方案是在按下第一个键时立即启动php脚本,并在按下第一个键后添加计时器。通过这种方式,用户可以立即看到正在发生的事情。
我如何用我当前的代码实现这一点?或者有没有比我想的更好的解决办法?
我代码:<input type="search" name="keyword" class="producten-icon divider" placeholder="Zoeken..." id="s_search">
我的ajax:
<script>
var typingTimer;
var doneTypingInterval = 300;
$("#s_search").on('keyup',function () {
clearTimeout(typingTimer)
var key = $(this).val();
if(key == ""){
$(".defaultresults").css("display", "inline");
$(".phpresult").css("display", "none");
}else{
typingTimer = setTimeout(doneTyping, doneTypingInterval);
$(".defaultresults").css("display", "none");
}
function doneTyping () {
$.ajax({
url:'includes/fetch_results.php',
type:'GET',
data:'keyword='+key,
beforeSend:function () {
$("#results").slideUp('fast');
},
success:function (data) {
$("#results").html(data);
$("#results").slideDown('fast');
}
});
}
});
</script>
最后是我的php文件
<?php
include 'connection.php';
$conn = new Connection;
if($_GET['keyword'] && !empty($_GET['keyword']))
{
// Results names
$results = "SELECT `naam` FROM `producten` WHERE `naam` LIKE '".$_GET['keyword']."%'";
$resultscon = $conn->query($results);
$resultscr = array();
while ($resultscr[] = $resultscon->fetch_assoc());
$eend = @array_map('current', $resultscr);
sort($eend, SORT_STRING | SORT_FLAG_CASE);
// echo '<pre>';
// print_r($eend);
// echo '</pre>';
echo '<div class="phpresult"><ul class="productenlijst">';
foreach($eend as $key => $result){
//De eerste waarde is leeg dus voor de code pas uit als key nummer is niet 0
if($key != '0'){
echo '<li>';
$char = $result[0];
if($char !== $lastChar){
if($lastChar !== ''){
echo '<br>';
}
echo '<span style="color:#eb9600;font-size:25px;font-weight:800;">'.strtoupper($char).'</span><br>';
$lastChar = $char;
}
echo $result.'<br></li>';
$i++;
}
}
echo '</ul></div>';
};
?>
如何设置一个间隔,重置布尔检查,如果你可以发送它
var sendSearch = true;
var isTiming = false;
var timeout = 300;
$("#s_search").on("keyup", function(){
if (!isTiming){
isTiming = true;
setInterval(function(){sendSearch = true;}, timeout);
}
if (sendSearch){
sendSearch = false;
// do your ajax post here
}
});