我认为这必须是一个非常常见的用例:用户键入文本框,查找是针对显示选项的数据库。当用户完成(离开文本框)时,确定输入的值是否是从列表中选取的(因此已经存在于数据库中),如果没有做任何事情,则输入的值被插入数据库(因为它是新的)。
问题是,单击选项列表会导致/ focusout /这意味着我不知道用户是否因为已完成而离开文本框,或者因为他正在选择一个值。因此,我没有很好的方法知道何时应该插入数据库。如果他键入两个字符并找到匹配项,则单击项目列表将导致插入两个字符。
我已经开了a bug关于它并发现其他各种类似问题但没有解决方案。
我想不出解决这个问题的办法。我正在使用jquery-ui的1.8.10版本。有人可以帮忙吗?
答案 0 :(得分:1)
失去焦点只是暂时的,你可以开始超时以延迟提交并取消它,如果该领域重新获得焦点。以下示例在处理之前等待0.5秒:
function BindTimeout($elem){
$elem.data('timer', setTimeout(function(){
$elem.removeData('timer');
if($elem.hasClass('autocomplete-open')){
BindTimeout($elem);
} else {
// Do whatever you need to do with the field value
}
}, 1000));
}
$('input').bind({
focus: function(){
clearTimeout($(this).data('timer'));
},
blur: function(){
BindTimeout($(this));
},
autocompleteopen: function(){
$(this).addClass('autocomplete-open');
},
autocompleteclose: function(){
$(this).removeClass('autocomplete-open');
}
});
编辑:当焦点丢失时,它会继续检查建议框是否仍然打开。
答案 1 :(得分:0)
// step 2 $(".ui-autocomplete").mousedown(function() { ListExit = true; }) // step 3 $("#MyTextBox").change(function() { // step 4 if (ListExist) { ListExit = false; return; } // step 5 $.ajax({ url: "@Url.Action("List", "MyController")", data: {term: $(this).val()}, success: function(ls) { if (ls.length > 0) return; // step 6: do database insertion } }); });