jQuery自动完成和更改问题

时间:2011-02-15 15:55:07

标签: jquery autocomplete triggers

我有一个带有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”。因此,更改在值更改之前触发更改。我的想法是,这不会有问题,因为不久之后结果会以正确的值再次触发触发器,但这不会发生。

像这样它有时会起作用,但不是所有的时间。我尝试了很多很多东西,有些工作得更好,有些更糟糕,但一直没有什么是正确的。我该怎么做正确的方法?

1 个答案:

答案 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次。在第五次(之后其他事件应该已经完成​​),您可以处理更改并使用新值。