我已经实现了一个jQuery UI Autocomplete框,而不是文本框的宽度,下拉选项正在扩展以填充页面的剩余宽度。
看一下这个例子,亲眼看看:http://jsbin.com/ojoxa4
我尝试在创建列表后立即设置列表的宽度,如下所示:
$('.ui-autocomplete:last').css('width',
$('#currentControlID').width()
);
这似乎无能为力。
我也尝试使用页面样式设置宽度:
ui-autocomplete { width: 500px; }
令人惊讶的是,这可行,但这意味着页面上的所有自动填充必须具有相同的宽度,这是不理想的。
有没有办法单独设置每个菜单的宽度?或者更好,任何人都可以解释为什么宽度对我不起作用?
答案 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)
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
});