【问题标题】:how to check if jqueryUI autocomplete dropdown box was open如何检查jqueryUI自动完成下拉框是否打开
【发布时间】:2011-12-09 08:40:37
【问题描述】:

jQgrid 表单包含几个 jQueryUI 自动完成框。

在 keydown 事件处理程序中,仅当自动完成下拉框未打开时才需要处理 Esc 按键。如果自动完成下拉菜单打开,则 Esc 按下应仅执行其默认操作(关闭下拉菜单并取消选择)。

如何检查自动完成下拉菜单是否打开? 它可以检查文档正文中是否打开了任何自动完成框。

jQuery.extend(jQuery.jgrid.edit, {
   beforeShowForm: function ($form) {
            var gridIdEncoded = $.jgrid.jqID($form[0].id.substring(8));
            $("#editmod" + gridIdEncoded).bind('keydown.formEvent', function (e) {
                 if (e.which === 27) {
                   // Todo: How invoke click only if any autocomplete dropdown is not opened
                   $("#TblGrid_" + gridIdEncoded + "_2 #cData").trigger("click");
                   return false;
                   }
               });
         }
     });

更新

我尝试使用 Molle 博士回答

 if (e.which === 27) {  
   alert( $('.ui-autocomplete.ui-widget:visible').length );
   if ( $('.ui-autocomplete.ui-widget:visible').length != 0 )
     // dropdown is open, allow default behaviour
     return;

但是 $('.ui-autocomplete.ui-widget:visible').length 如果按下 esc 则为 0(如果按下其他键且下拉菜单打开则为 1)。 看起来导致 Esc 原因导致自动完成默认行为首先关闭下拉菜单。 只有在此之后,我的处理程序才被执行,它没有发现下拉菜单被执行。

如何解决这个问题?

【问题讨论】:

    标签: javascript jquery jquery-ui jqgrid jquery-ui-autocomplete


    【解决方案1】:

    用途:

    !!$($('autocompleteselector').autocomplete('widget')).is(':visible')
    

    ..检查特定的自动完成。

    要检查是否有任何下拉菜单打开,请使用:

    !!$('.ui-autocomplete.ui-widget:visible').length
    

    【讨论】:

    • 谢谢。在 keydown.formevent 方法中,下拉菜单已经关闭,并且长度始终为 0,因此此检查没有发现下拉菜单已打开。我更新了问题。如何解决这个问题?
    • 更新后的问题听起来好像找到最后打开的下拉菜单就足够了?如果是,则有一个用于自动完成的开放事件。当打开事件触发时,您所要做的就是将活动的自动完成/下拉列表存储在一个变量中。
    • 好像没有。如果按下 Esc,我们需要知道下拉菜单是否打开。如果 esc 键由自动完成处理,也许可以停止 esc 键传播?或者是否有可能在自动完成 esc 键处理程序关闭下拉菜单或强制自动完成关闭 keyup 中的下拉菜单或其他想法之前更早地捕捉 esc 按键?
    • 是的,没错。我可以通过在自动完成关闭后取消 ESC 按键来完成这项工作: $('.autocomplete').bind('autocompleteclose', function(event, ui) {return false; });
    • 额外的位是什么/它有什么作用? !!$。我找不到参考资料。
    【解决方案2】:

    Andru 的评论是正确的。如果您在自动完成关闭后取消事件的传播,它会压制 ESC

    $('.autocomplete').bind('autocompleteclose', function(event, ui) {
    return false;
    });
    

    【讨论】:

    • 我不明白这个答案。这会阻止自动完成下拉关闭。我应该在'keydown.formEvent'方法中手动使用这个添加关闭自动完成吗?应该使用哪个代码来关闭下拉菜单?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2011-07-14
    相关资源
    最近更新 更多