jQuery UI自动完成宽度未正确设置

End*_*der 67 jquery jquery-ui autocomplete jquery-ui-autocomplete

我已经实现了一个jQuery UI Autocomplete框,而不是文本框的宽度,下拉选项正在扩展以填充页面的剩余宽度.

看看这个例子,亲自看看:http://jsbin.com/ojoxa4

我已经尝试在创建后立即设置列表的宽度,如下所示:

$('.ui-autocomplete:last').css('width',
                               $('#currentControlID').width()
                              );
Run Code Online (Sandbox Code Playgroud)

这似乎什么都不做.

我也尝试使用页面样式设置宽度:

ui-autocomplete { width: 500px; }
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这会起作用,但这意味着页面上的所有自动填充必须具有相同的宽度,这并不理想.

有没有办法单独设置每个菜单的宽度?或者更好,任何人都可以解释为什么宽度不适合我?

Arn*_*met 102

我使用这个插入式解决方案:

jQuery.ui.autocomplete.prototype._resizeMenu = function () {
  var ul = this.menu.element;
  ul.outerWidth(this.element.outerWidth());
}
Run Code Online (Sandbox Code Playgroud)

这基本上是@madcapnmckay的解决方案,但这不需要改变原始来源.

  • 现场回答.+1 (2认同)
  • 这应该是公认的解决方案 - 因为它是最简单的,也是最具侵入性的 (2认同)
  • 我认为这是最好的答案,因为适用于所有 jquery 自动完成声明,而且很清楚! (2认同)

End*_*der 58

事实证明问题是菜单正在扩展以填充其父元素的宽度,默认情况下是父元素.这可以通过给它一个正确宽度的包含元素来纠正.

首先我添加了<div>这样的:

<div id="menu-container" style="position:absolute; width: 500px;"></div>
Run Code Online (Sandbox Code Playgroud)

绝对定位允许我<div>在输入后立即放置,而不会中断文档流.

然后,当我调用自动完成时,我appendTo在选项中指定一个参数,导致菜单被附加到我的<div>,然后继承它的宽度:

$('#myInput').autocomplete({ source: {...}, appendTo: '#menu-container'});
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.但是,我仍然有兴趣知道为什么这是必要的,而不是插件正常工作.

  • 我有完全相同的问题.查看Jquery UI站点上的示例并尝试复制我无法看到我在做什么不同.是我还是"新"官方自动完成比Jorn旧的更糟糕? (3认同)

mad*_*kay 37

我在自动完成代码中进行了挖掘,罪魁祸首就是这一点

_resizeMenu: function() {
    var ul = this.menu.element;
    ul.outerWidth( Math.max(
        ul.width( "" ).outerWidth(),
        this.element.outerWidth()
    ) );
},
Run Code Online (Sandbox Code Playgroud)

我不确定ul.width("")假设是做什么但ui.width("").outWidth()总是返回正文的宽度,因为这是附加到ul的内容.因此,宽度永远不会设置为元素宽度....

无论如何.要修复,只需将其添加到您的代码中

$element.data("autocomplete")._resizeMenu = function () {
        var ul = this.menu.element;
        ul.outerWidth(this.element.outerWidth());
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

编辑:如果有人想看到这里的错误测试案例,那就是.

  • 他说,显然我们应该包括某些css文件.它没有记录,对我来说似乎有点傻,因为它可以根据输入计算宽度,而不需要外部样式. (3认同)
  • 花了一些时间自己深入研究并发现了一些事情:1.`ul.width("")`调用是删除之前对菜单元素进行的任何显式宽度设置.2.必须包含CSS才能正常工作,因为基本CSS在`.ui-menu`元素上设置`float:left`,因此,在计算宽度时,`ul.width("").outerWidth()`考虑到考虑任何超长结果的宽度,否则它占用`input`元素的宽度. (2认同)
  • @madcapnmckay一种更简单的方法是以插入方式使用您的技术:http://stackoverflow.com/a/11845718/346005 (2认同)

小智 25

我知道这一点早已得到解答,但我认为有一个更好的解决方案

$(".autocomplete").autocomplete({
    ...
    open: function() {
        $("ul.ui-menu").width( $(this).innerWidth() );
        ...
    }
    ...
});
Run Code Online (Sandbox Code Playgroud)

它对我来说很好.

  • 非常好的解决方案!谢谢! (2认同)

And*_*kas 22

我知道很久以前就已经回答了这个问题,但我遇到了同样的问题.我的解决方案是增加位置:绝对

  • 澄清其他人:.ui-autocomplete {position:absolute; } (12认同)
  • 这完全适合我.字面上被一个`!important`和宾果宾果,快乐的老板砍掉了.#dontVoteTrump #actuallyMakeAmericaGreatAgain (3认同)

小智 20

在open事件中设置css!

$('#id').autocomplete({
    minLength: 3,
    source: function(request, response) {
        $.ajax({
                    url: "myurl",
                    dataType: "json",
                    type: 'POST',
                    data: {
                        'q': request.term,

                        'maxRows': 15
                    },
                    success: function(data) {

                        response($.map(data, function(item) {
                            return {
                                label: item.name,
                            }
                        })),
                    }
                })
            },
            select: function(event, ui) {
                $("#id").val(ui.item.label);
            },
            focus: function ( event, ui ){
                $form.find('#id').val(ui.item.label);
                return false;
            },
            open: function(){
                $('.ui-autocomplete').css('width', '300px'); // HERE
            }
        })
Run Code Online (Sandbox Code Playgroud)


Nic*_*sen 15

我也遇到了这个问题,但意识到我只是忘了包含对jquery.ui.autocomplete.css样式表的引用.您是否在布局/母版页中包含了该样式表?

  • 或者将以下内容添加到CSS中,因为这是该文件中的所有内容:`.ui-autocomplete {position:absolute; 顶部:0; 左:0; cursor:default; }` (3认同)