【问题标题】:jQuery's Autocomplete dropdown is not showing after upgrade to jQuery UI 1.10.3升级到 jQuery UI 1.10.3 后,jQuery 自动完成下拉菜单不显示
【发布时间】:2013-06-08 09:34:10
【问题描述】:

在我的 Ruby on Rails 应用程序中,我使用的是 jQuery UI 1.9.2(通过 jquery-ui-rails)。我在模态对话框表单中有一个自动完成字段,它使用 Ajax 和 Json 填充它的下拉建议框。它工作正常,向我展示了正确的建议。

我随后升级到 jQuery UI 1.10.3(使用bundle update),现在自动完成下拉建议框不再起作用。它在 JavaScript 控制台中没有显示错误。事实上它表明返回的Json是正确的。

我尝试在 JS 中重写自动完成功能以手动执行调用(使用自动完成的 source: $.ajax {} 调用,但仍然没有。

有人向我建议,问题可能是 jQuery 更改了导致 jquery-ui-rails gem 停止工作的内容,但在向他们提交 bug ticket 后,事实证明这不是问题。

任何帮助将不胜感激。

回答注意事项:
mhu's answer 是正确的,您应该尽可能避免篡改 z-Indexes(这就是我将其标记为正确的原因)。 然而在我的情况下(自动完成文本框位于模态对话框中),下拉菜单只会显示在对话框的宽度内(如果文本比这宽,它会被隐藏并且您不能使用滚动条)。因为我不想那样做,所以我做了我在下面的my answer 中描述的事情并且它有效。我确实给自己做了各种 cmets 和注释,以确保它在任何 jQueryUI 更新后仍然有效。

【问题讨论】:

    标签: jquery jquery-ui autocomplete ruby-on-rails-3.2 jquery-ui-autocomplete


    【解决方案1】:

    在到处搜索此问题后,我发现没有人可以解决我的问题,因为我无法生成任何错误消息并且我显示的代码是正确的。在有人建议我阅读 jQuery 更改日志(我承认我没有)之后,我发现了 jQuery 中的错误以及解决方法:

    jQuery UI 1.10.1 changelog 的“自动完成”部分下显示:

    Added: Use .ui-front instead of .zIndex() for the suggestions menu. (7d5fe02)
    

    按照提供的链接并查看 jQuery 代码修复程序,给了我一个想法:我执行了自动完成搜索,然后我将模态对话框移到了一边!就在那时我注意到 Autocoplete 下拉建议菜单位于模态对话框的后面。

    我通过添加以下 CSS 规则解决了这个问题:

    ul.ui-autocomplete.ui-menu {
      z-index: 1000;
    }
    

    我已经向 jQuery 提交了一个Bug ticket,所以我希望它会在 1.10.4 中得到处理,这样就不再需要解决方法了。

    我希望这对其他人也有帮助。

    【讨论】:

      【解决方案2】:

      使用 jQuery UI 1.10 时,您不应该乱用 z-indexes (http://jqueryui.com/upgrade-guide/1.10/#removed-stack-option)。只需确保自动完成元素的 DOM 顺序正确:autocomplete.insertAfter(dialog.parent())

      示例

       var autoComplete,
           dlg = $("#dialog"),
           input = $("#input");
      
       // initialize autocomplete
       input.autocomplete({
           ...
       });
      
       // get reference to autocomplete element
       autoComplete = input.autocomplete("widget");
      
       // init the dialog containing the input field
       dlg.dialog({
            ...
       });
      
       // move the autocomplete element after the dialog in the DOM
       autoComplete.insertAfter(dlg.parent());
      

      【讨论】:

      • 但这比以前复杂多了......我知道你可能不知道原因,但这似乎我突然不得不比以前多执行2个步骤
      • 这真的只是一个声明:autoComplete.insertAfter(dlg.parent());。其余的只是设置自动完成所需的标准内容。
      • 好的,这是有道理的。但是你为什么要这样引用 autocomplete("widget") 呢?我从来不需要这样做
      • 您也可以使用$(".ui-autocomplete"),但这将针对页面上的所有自动完成元素,而不仅仅是附加到input 的那个。
      • 如果您来到这里时遇到了与颜色框内的自动完成类似的问题:autoComplete.insertAfter($('#cboxLoadedContent').parent());
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2011-08-16
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多