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

时间:2011-04-13 02:30:10

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

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

看一下这个例子,亲眼看看:http://jsbin.com/ojoxa4

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

$('.ui-autocomplete:last').css('width',
                               $('#currentControlID').width()
                              );

这似乎无能为力。

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

ui-autocomplete { width: 500px; }

令人惊讶的是,这可行,但这意味着页面上的所有自动填充必须具有相同的宽度,这是不理想的。

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

16 个答案:

答案 0 :(得分:100)

我使用此插入式解决方案

jQuery.ui.autocomplete.prototype._resizeMenu = function () {
  var ul = this.menu.element;
  ul.outerWidth(this.element.outerWidth());
}

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

答案 1 :(得分:57)

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

首先我添加了<div>,如此:

<div id="menu-container" style="position:absolute; width: 500px;"></div>

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

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

$('#myInput').autocomplete({ source: {...}, appendTo: '#menu-container'});

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

答案 2 :(得分:37)

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

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

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

反正。要修复,只需将其添加到您的代码

$element.data("autocomplete")._resizeMenu = function () {
        var ul = this.menu.element;
        ul.outerWidth(this.element.outerWidth());
}

这是一个错误吗?

编辑:  如果有人想看到bug here的缩小测试用例,那就是。

答案 3 :(得分:22)

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

答案 4 :(得分:22)

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

$(".autocomplete").autocomplete({
    ...
    open: function() {
        $("ul.ui-menu").width( $(this).innerWidth() );
        ...
    }
    ...
});

它对我来说很好。

答案 5 :(得分:18)

在开放事件中设置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
            }
        })

答案 6 :(得分:15)

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

答案 7 :(得分:1)

好吧,恩德。我不知道我的解决方案是否可以帮助您,但是使用Jqueryui remote-with-cache.html它可以工作。我只是在文本框中输入size属性。

请参阅以下代码:

<div class="demo">
    <div class="ui-widget">
        <label for="birds">Birds: </label>
        <input id="birds" size="30"/>
    </div>
</div>

答案 8 :(得分:0)

如果您正在使用官方jQuery ui自动完成功能(我在1.8.16上)并且想要手动定义宽度,则可以这样做。

如果您使用的是缩小版(如果没有,则通过匹配_resizeMenu手动查找),找到...

_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))}

...并将其替换为(在Math.max之前添加this.options.width ||)...

_resizeMenu:function(){var a=this.menu.element;a.outerWidth(this.options.width||Math.max(a.width("").outerWidth(),this.element.outerWidth()))}

...您现在可以在.autocomplete({width:200})函数中包含宽度值,jQuery将尊重它。如果没有,它将默认为计算它。

答案 9 :(得分:0)

我知道这个问题早已得到解答,但我找到的最简单的方法是使用自动完成的ID,并将宽度设置为100px,您可以调用

$('.ui-autocomplete-input#MyId').css('width', '100px');

完成$('#MyId').autocomplete(...);电话后

。这样,您最终不会将DOM中自动完成文本框的顺序与脚本绑定。

答案 10 :(得分:0)

如果您无法动态设置宽度,并且没有任何工作尝试包含此

http://code.google.com/p/jquery-ui/source/browse/trunk/themes/base/jquery.ui.autocomplete.css?spec=svn3882&r=3882

在链接表或硬编码中,并在此处设置参数。

在尝试其他所有内容后,它对我有用

答案 11 :(得分:0)

我的解决方案是将自动完成附加到带有id的div,然后为特定的ul设置CSS:

的jQuery / JavaScript的:

$("input[name='search-text]").autocomplete({
    appendTo: "#item-search-autocomplete",
    source: ....
});

CSS:

#item-search-autocomplete .ui-autocomplete {
    width: 315px;
}

像魅力一样。

答案 12 :(得分:0)

如果你想使用css试试这个:

.ui-widget-content.ui-autocomplete{ width: 350px; }

它将适用于每个自动完成输入。

答案 13 :(得分:-1)

我在我的css文件中有这个,所以自动完成功能会使用样式width的{​​{1}}:

span

答案 14 :(得分:-1)

我遇到了同样的问题,并通过使用这段代码解决了它,虽然这是一个小小的打击和试用的东西,但它的工作原理,我无法设置宽度所以我决定设置{ {1}}属性。

max-width

看看什么最适合你。希望这有帮助。

答案 15 :(得分:-2)

自动填充功能有一个宽度选项。我用它来做1.3.2。

$('#mytextbox').autocomplete(url, {  
        width: 280,
        selectFirst: false,
        matchSubset: false,
        minChars: 1,
        extraParams:{myextraparam:myextraparam},
        max: 100
    });
相关问题