【问题标题】:jQuery UI Autocomplete: Determine if search window is open?jQuery UI 自动完成:确定搜索窗口是否打开?
【发布时间】:2011-07-23 22:24:22
【问题描述】:

我想在我的输入的 onclick 事件中触发搜索,但前提是搜索窗口尚未打开。目前,我这样做:

$(this).bind('click.ajaxselect', function(e) {
    if(!$(this).autocomplete('widget').is(':visible')) {
        $(this).autocomplete('search','');
    }
});

但我并不太喜欢使用:visible 选择器,因为它也会搜索所有的父母。我可以检查一些属性吗?

Dialog has this isOpen method,自动完成有类似的吗?

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    设置一个简单的变量并不难:

    $('.my_selector').bind('autocompleteopen', function(event, ui) {
        $(this).data('is_open',true);
    });
    
    $('.my_selector').bind('autocompleteclose', function(event, ui) {
        $(this).data('is_open',false);
    });
    

    那么你的听众很容易:

    $(this).bind('click.ajaxselect', function(e) {
        if(!$(this).data('is_open')) {
            $(this).autocomplete('search','');
        }
    });
    

    【讨论】:

      【解决方案2】:

      我参加聚会已经很晚了,但我有一个替代的、更高效的解决方案。由于需要做的只是检查 CSS 属性的值,因此使用状态变量和两个事件处理程序来更新所述变量似乎是一个非常繁重(并且可能很脆弱)的解决方案。我觉得这种编码风格使得 javascript 驱动的网络的某些部分感觉迟缓,即使我们现在拥有强大的计算能力。但我离题了。

      您可以像这样测试 CSS display 属性:

      $(this).bind('click.ajaxselect', function(e) {
          if($(this).autocomplete('widget')[0].style.display === 'none') {
              $(this).autocomplete('search','');
          }
      });
      

      为了完整起见,以下是在“无上下文”函数中实现此类检查的方法:

      function isSearchWindowOpen(id_of_input_element_the_autocomplete_is_bound_to) {
          return $('#' + id_of_input_element_the_autocomplete_is_bound_to)
              .data('ui-autocomplete')          /* jquery's internal wrapper object */
              .widget()[0]                      /* the actual search window DOM element */
              .style.display === 'block';       /* standard display CSS attribute */
      }
      

      【讨论】:

      • 我不认为这更优雅。您依赖于实现细节。还有其他显示和隐藏事物的方法。此外,如果id_of_input_element_the_autocomplete_is_bound_to 包含任何有趣的字符,例如[.,您可能会遇到转义问题。
      • @mpen:你认为.style.display 是一个实现细节吗(暗示它将来可能会改变?)。 2016 年?好吧,也许“优雅”是一个主观术语,但它肯定会表现得更好。我会编辑它。
      • @mpen:无论如何感谢您的意见。我刚才在一个项目中需要这个确切的功能,而且我只在几个地方需要它,所以我非常了解我的输入。对于一般情况,你是对的,没有添加转义的奇怪字符可能会搞砸。
      • 是的。还有其他方法可以使某些东西不可见。在我的脑海中:您可以将不透明度设置为 0,将其放置在屏幕边缘之外,或者将其与 DOM 分离。还可以想象,W3C 会在 JS 中添加适当的显示/隐藏功能,这样你就不会“记住”之前的 display 属性。
      • @mpen:当然,还有(当然,甚至会有)更多其他方式,但这是(我很确定它会保留)切换某些东西的基本形式JS.
      猜你喜欢
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多