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


74

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

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

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

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

这似乎无能为力。

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

ui-autocomplete { width: 500px; }

确实,这确实起作用,但是这意味着页面上的所有自动完成功能都必须具有相同的宽度,这并不理想。

有没有一种方法可以分别设置每个菜单的宽度?或者更好的是,有人可以解释为什么宽度对我来说不正确吗?


@hmoyat的答案应该被接受。
Kosta Kontos

Answers:


114

我使用此嵌入式解决方案

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

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


3
这应该是公认的解决方案-因为它是最简单,最不侵入性的
向往

2
我认为这是最好的答案,因为它适用于所有jquery自动完成声明,而且很明显!
Cristiam Mercado 2015年

1
不知道这段代码到底是做什么的-但是它神奇地将autocomplete-width的大小调整为有关输入框的宽度;就像它本来可以工作,但在许多情况下都不会。
low_rents '16

嘿,谢谢你的回答。您能否进一步了解代码的确切功能,以便我找出最合适的代码?它覆盖了_resizeMenu功能吗?我将其放在一个脚本中,该脚本在Web应用程序的每个页面上运行一次,您对更好的放置有任何建议吗?谢谢。
他们

element.autocomplete('instance')._resizeMenu更好,因为您可以仅覆盖实例。而不是覆盖同一页面上的任何其他自动完成功能。
Lomax

61

事实证明,问题在于菜单正在扩展以填充其父元素(默认情况下为主体)的宽度。可以通过为其提供包含正确宽度的包含元素来纠正此问题。

首先,我添加了一个<div>类似的代码:

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

绝对定位使我可以<div>在输入之后立即放置而不中断文档流。

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

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

这样可以解决问题。但是,我仍然想知道为什么这样做是必要的,而不是插件正常工作。


3
我遇到完全相同的问题。查看Jquery UI网站上的示例并尝试复制,我看不到我在做什么。是我还是“新”官方自动完成功能比乔恩的旧自动完成功能差?
madcapnmckay 2011年

即使宽度不是问题,也会建议使用appendTo选项。它将允许您重用具有不同样式和选项的小部件,而不必将它们全部浮动在文档的底部。
Daniel Del Core

抱歉,对此投了反对票,Arnaud的回答要好得多。
David Grenier

1
@DavidGrenier我不赞成否决一个答案,因为另一个答案更好。除非您有特定原因认为此答案无用。我认为最好通过投票表决来表达对其他问题的偏爱,但是我相信您已经做到了:) stackoverflow.com/help/privileges/vote-down
Biruk Abebe

这是最好的解决方案
Gaurav Chavan'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());
}

这是一个错误吗?

编辑:如果有人想看到一个简化的测试案例的错误在这里它是。


有人关闭了它...不知道为什么。我仍然在最新的JQuery UI中遇到此问题。
Dan Loewenherz

3
他说,显然我们应该包括某些CSS文件。它没有文档,对我来说似乎有点愚蠢,因为它可以根据输入确定宽度,而无需使用外部样式。
madcapnmckay 2011年

2
刚刚花了一些时间自己研究了一下,发现了两件事:1.ul.width( "")调用是删除以前对菜单元素所做的任何显式宽度设置。2.必须包含CSS才能正常工作,因为基础CSS设置float: left.ui-menu元素上,因此在计算宽度时,ul.width( "" ).outerWidth()会考虑任何超长结果的宽度,否则会考虑input元素的宽度。
Phuong LeCong 2011年

2
@madcapnmckay一个更简单的方法是直接使用您的技术:stackoverflow.com/a/11845718/346005
Arnaud Leymet,2012年

31

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

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

对我来说很好。


1
非常好的解决方案!谢谢!
利隆2015年

不错的解决方案,请注意,它接受输入参数,因此请在使用前阅读手册-例如,如果您在一页上没有一个自动完成功能时编写函数。
user1954544 '02

24

我知道这个问题早已得到解决,但我遇到了同样的问题。我的解决方案是添加位置:绝对


13
为其他人澄清:.ui-autocomplete {位置:绝对;}
ynkr 2012年

3
这完全为我工作。从字面上砍死了一个!important和宾果游戏邦戈,快乐的老板。#dontVoteTrump #actuallyMakeAmericaGreatAgain
The

这个答案应该有更多的选票。对我来说,其他一些响应似乎是非常棘手的解决方案。
微风

21

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

我这样做了,实际上我将结果放在div中并设置了位置。它可在IE7和IE9兼容性视图以外的其他浏览器上使用。这是为什么?这是我的做法, appendTo: "#results", open: function(){ var position = $("#results").position(), left = position.left, top = position.top; $("#results > ul").css({left: (left + 15) + "px", top: (top + 30) + "px", width: (206) + "px" }); },
Tsukimoto Mitsumasa 2012年

您可能还需要重置max-width
Christophe Roussy 2014年

15

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


这对我来说是个问题-我怀疑对于大多数人来说也是如此。你们都认为jQ UI在默认情况下是如此糟糕吗?;)
vemv 2013年

3
或将以下内容添加到您的CSS中,因为这就是该文件中的全部内容:.ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; }
Christoph Fink

有些人可能忘记了它,但实际上却遇到了其他答案中解释的错误/问题
userfuser 2015年

3

$("#autocompleteID").autocomplete({
source: "http://myhost/magento/js/jquery/ui/php/ville.php",
minLength: 1,
open: function(event, ui)
{
   $("#autocompleteID").autocomplete ("widget").css("width","300px");  
} 
});


1

如果您想使用CSS,请尝试以下操作:

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

它将对每个自动完成输入起作用。


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})函数中包含一个width值,jQuery会尊重它。如果不是,它将默认进行计算。


0

我知道这早已得到答复,但是我发现最简单的方法是使用自动完成功能的ID,并将宽度设置为100px

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

$('#MyId').autocomplete(...);通话结束后。这样,您最终就不会将DOM中自动完成文本框的顺序与脚本联系在一起。


0

如果您无法动态设置宽度,并且根本没有任何尝试尝试包括此宽度

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

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

尝试了所有其他方法后对我有用


2
您链接到的jquery.ui.autocomplete.css文件中有意义的部分是@ andrius-chamentauskas上面指出的position:absolute。以下内容为我修复了此问题:.ui-autocomplete {位置:绝对;}
ynkr 2012年

0

好吧,恩德。我不知道我的解决方案是否能为您提供帮助,但是使用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>

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;
}

奇迹般有效。


-1

我遇到了相同的问题,并通过使用这段代码解决了该问题,尽管这有点麻烦和尝试,但它确实可以设置宽度,因此我决定设置该max-width属性。

  $('.ui-autocomplete').css('margin-left','25%') //center align
  $('.ui-autocomplete').css('max-width','38%') //hit and trial
  $('.ui-autocomplete').css('min-width','38%') //hit and trial

查看最适合您的方法。希望这会有所帮助。


-2

自动完成功能有一个宽度选项。我将其用于1.3.2。

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

3
您必须使用其他一些自动完成插件。jQuery UI没有这样的选项:jqueryui.com/demos/autocomplete/#options
Ender

1
实际上,我正在将jquery 1.3.2与jquery.autocomplete.min.js 1.0.2一起使用。如果您在jquery.autocomplete.min.js中查找宽度,则会看到以下行:if(options.width>0)element.css("width",options.width); 这将设置自动完成的宽度。
dev4life 2011年

-2

我的css文件中有此文件,因此自动完成功能采用width样式的span

 span input.ui-autocomplete-input {
     width: 100%;
 }

请注意,您发布的实现信息不足。作者拥有自己的html,您的样式不符合他的要求。
Michael Zhavzharov 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.