ajaxデータソースのオートコンプリートがアタッチされた入力フィールドがあります。
入力フィールドのキーアップハンドラーがあります。これは、Enterキーを押している人を探し、検索ボタンをクリックすると、ajaxが別のdivにデータをロードします。
問題は、人がすばやく入力してEnterキーを押すと、オートコンプリートがポップアップすることです。
私は以下を試しました:
を追加し
$('#autocomplete').autocomplete('close')
ます。おそらくオートコンプリートがまだ開いていないため、これは機能しません。入力した場合は、オートコンプリートが表示されるのを待ってから、Enterキーを押すと、正しく閉じられます。を追加し
$('#autocomplete').autocomplete('destroy')
ます。これは機能しますが、フィールドに戻って別の検索を試みると、オートコンプリートが機能しなくなります。
したがって、保留中のリクエストをキャンセルし、オートコンプリートが開いている場合はそれを無効にしたり破棄したりせずに閉じる方法が必要です。
編集:コードサンプル(私の実際のコードではなく、問題を示すためのスタブだけです)。ファイル名はscratch.phpです
<?php
// Stub for search results
if ($_GET['search'])
{
print "Search results for ".$_GET['search']." here";
exit();
}
// Simulated DB search
if ($_GET['term'])
{
print '[{"label":"A 1"},{"label":"A 2"},{"label":"A 3"},{"label":"A 4"}]';
exit();
}
?>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/ui/1.10.1/jquery-ui.js"></script>
<link type="text/css" href="http://code.jquery.com/ui/1.10.1/themes/redmond/jquery-ui.css" rel="stylesheet" />
<script language='javascript'>
$(document).ready(function() {
$('#searchfor').on('keyup',function(e) {
if (e.which == 13) $('#search').trigger('click');
});
$('#searchfor').autocomplete({
source: "/scratch.php",
minLength: 2,
select: function( event, ui ) {
$('#searchfor').val(ui.item.value);
$('#search').trigger('click');
}
});
$('#search').on('click',function() {
try
{
// Cancel any pending autocompletes without destroying the autocomplete completely here.
// This currently doesn't work
$('#searchfor').autocomplete("close");
}
catch(e)
{
// Do nothing except prevent an error
}
$('#results').load('scratch?search='+encodeURIComponent($('#searchfor').val()));
});
});
</script>
</head>
<input id='searchfor' /> <input id='search' type='button' value='search' />
<div id='results'></div>
</html>