2012-08-14 154 views
1

我有一个文本框绑定到jQuery UI的自动完成。当用户从自动完成下拉列表中选择一个选项时,JSON数据将用于使用来自远程源的用户详细信息填充表单。jQuery UI自动完成等待搜索事件完成

我有绑定了以下功能的复位按钮:

$('#btn_reset').on('click', function() { 
    $('#txt_name').autocomplete('search'); 
    $('.ui-menu-item').children().eq(0).click(); 
    return false; 
}); 

这可与少量的本地数据为searchclick()完成之前被调用,但是与大量外部数据,search没有及时完成,因此给我一个'item' is null or not an object错误。

我怎样才能让jQuery等到search完成后才致电click()

下面是一个使用本地数据源的工作小提琴:http://jsfiddle.net/3KTtT/3/

回答

1

解决方法是将函数绑定到自动完成的open事件,以检查布尔变量以确定表单是否正在重置。

var reset = false; 
$(function() {  
    $('#txt_name').autocomplete({ 
     source: [{"label":"john smith","address":"19 Tree Lane"}], 
     delay: 0, 
     autoFocus: true, 
     open: function() { 
      if(reset){ 
       $('.ui-menu-item').children().eq(0).click(); 
       reset = false; 
      } 
     }, 
     select: function(event, ui) { 
      $('#txt_address').val(ui.item.address); 
     } 

    }); 

    $('#btn_reset').on('click', function() { 
     reset = true; 
     $('#txt_name').autocomplete('search'); 
     return false; 
    }); 

}); 

在这里看到小提琴:http://jsfiddle.net/RVnkz/2/

+0

作为答案张贴它很酷的东西的人。很高兴你把事情解决了。它现在对远程数据有效吗? – jjay225 2012-08-14 15:04:28

+0

是啊工作完美:)试图找到一个基本的远程JSON数据源发布我的原始小提琴但无济于事... 再次感谢您的帮助btw – Elliott 2012-08-14 15:30:09

+0

好的工作Elliott :)你很欢迎嘿。 – jjay225 2012-08-15 07:07:27

0

我已经改变了你的榜样,包括延时循环,它检查是否有一个值,然后我打电话给你的点击事件。应该把你在正确的轨道上:

jsFiddle Demo

如果你看一下下面的代码,我有大于0,所以您可以测试代码,但它应该是小于1

$('#btn_reset').on('click', function() { 
    $('#txt_name').autocomplete('search'); 
    if($('#txt_name').val().length>0) //THIS LINE 
    { 
     CheckValue(); 
    } 
    else 
    {      
    $('.ui-menu-item').children().eq(0).click(); 
    return false; 
    } 
}); 
+0

'CheckValue'似乎只之前'点击添加一个一次性的1500延迟()'被激发:( – Elliott 2012-08-14 14:14:12

+0

是这就是正确的,因为它发现有一个值为“txt_name”。如果它没有,你会看到CheckValue()被再次调用,如果“loaded”不等于1.检查这个改变[jsFiddle](http://jsfiddle.net/jjay225/3KTtT/20 /) - 我已经设置“加载”等于0,并添加了一个console.log来显示它被调用的次数。 – jjay225 2012-08-14 14:29:33

+0

感谢你对此的帮助,但我刚刚发现了一种完全不同的方式,在自动完成打开和“click()”之间没有延迟。我会在第二个 – Elliott 2012-08-14 14:47:30