我有一个带有id文本(“#text”)的文本框,其中包含一个自动完成:
$("#text").autocomplete(data);
这很好用。 现在我想要三件事:
a)如果用户点击自动填充选项 - >搜索
b)如果用户输入内容并显示自动填充操作,但他点击了其他位置 - >搜索他输入的字符串
c)如果用户输入必须自动填充的内容并点击其他地方(更改事件) - >搜索他输入的字符串
听起来很容易,但我无法让它发挥作用。在片刻,我有类似的东西:
$("#text").result(function(e) {
$("#text").trigger("change");
});
$("#text").change(function(e){
$(".x").load(...);
});
如果我不使用该触发器,则a)根本不起作用,如果我键入“a”并单击自动完成选项,则“#text”在更改功能中包含“a”。因此,更改在值更改之前触发更改。我的想法是,这不会有问题,因为不久之后结果会以正确的值再次触发触发器,但这不会发生。
像这样它有时会起作用,但不是所有的时间。我尝试了很多很多东西,有些工作得更好,有些更糟糕,但一直没有什么是正确的。我该怎么做正确的方法?
答案 0 :(得分:2)
我从未使用过您正在使用的自动填充功能,但这是一个应该包含在JavaScript解决问题工具箱中的工具。
如果事件在另一个事件发生之前立即触发,并且您需要在处理第一个事件之前等待第二个事件完成,请使用setTimeout(...)
。有时候看起来需要延迟,但通常需要对setTimeout(...,0)进行一些嵌套调用
function onIdle(fn, loops) {
loops = loops == null ? 1 : loops;
if (loops > 0) {
setTimeout(function() { onIdle(fn, loops - 1); }, 0);
} else {
fn();
}
}
使用上面的代码,您可以在onChange处理程序中执行类似的操作:
onIdle(function() { ... }, 5);
这将连续调用setTimeout,5次。在第五次(之后其他事件应该已经完成),您可以处理更改并使用新值。