【发布时间】:2013-01-18 07:23:36
【问题描述】:
我正在使用来自 jquery-ui 的Autocomplete。在多个值中,您可以在空格后获取每个单词的下拉列表,但下拉列表显示为输入框的大小。是否可以使下拉菜单出现在每个光标下方,其宽度等于下拉单词而不是输入框的整个长度?
编辑:示例(类似 Google 的搜索框):
当您访问谷歌并随着句子的继续输入一个长句子时,在每个单词之后,光标位置下方的每个单词都会出现一个自动完成下拉菜单。所以我需要一个类似的下拉菜单,可以添加到 jQuery Autocomplete
我的功能这么大是因为它具有多个单词和按字母顺序显示数组的功能。
这是<script 代码:
<script>
$(function() {
var availableTags = <?php echo json_encode($sometags); ?>;
function split( val ) {
return val.split( / \s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}
$( "#query" )
// don't navigate away from the field on tab when selecting an item
.bind( "keydown", function( event ) {
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
minLength: 1,
source: function( request, response ) {
// delegate back to autocomplete, but extract the last term
response( $.ui.autocomplete.filter(
availableTags, extractLast( request.term ) ) );
var term = $.ui.autocomplete.escapeRegex(request.term)
, startsWithMatcher = new RegExp("^" + term, "i")
, startsWith = $.grep(availableTags, function(value) {
return startsWithMatcher.test(value.label || value.value || value);
})
, containsMatcher = new RegExp(term, "i")
, contains = $.grep(availableTags, function (value) {
return $.inArray(value, startsWith) < 0 &&
containsMatcher.test(value.label || value.value || value);
});
response(startsWith.concat(contains));
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
terms.push( "" );
this.value = terms.join( " " );
return false;
}
});
});
</script>
编辑:就像谷歌框一样,下拉列表应该包含在输入框的宽度内,例如,输入框中最后一个单词的下拉框应该调整大小而不是向右而是向左。下拉框的右边缘应与输入框的右边缘对齐,并且下拉框的总宽度(如果单词与输入框一样大或大于输入框)不应超过输入框的宽度。
更新:
这是类似 google 的自动完成功能的最终模式:Fiddle(2013 年 16 月 2 日更新)
特点:
1) 修复了多个单词按字母顺序排列的建议 (jQuery-ui autocomplete multiple values sort results alphabetically)
2) 从 2 个数组中检索建议,第一个建议以输入框的全宽打开,如谷歌,其余建议以最长建议的宽度打开
3) 修复了“空格”(多个值)后输入单词之前下拉菜单打开的错误。
4) 防止下拉菜单在末尾保持打开状态,同时在其间添加单词。
5) 16/2/2013更新:当从建议框输入的标签长度超过输入框的长度,输入下一个标签时,输入框从第一个标签开始显示标签或移回第一个标签位置,不是从这里看到的光标最后放置的位置 - http://jqueryui.com/autocomplete/#multiple。此问题已修复。
这是一个类似的小提琴,只使用了一个数组,并且建议总是在最长建议的宽度 - FIDDLE
感谢 Jeffery To 提供了该问题的主要解决方案,感谢 Vadim 和 Dom,他们的回答为创建上述 mod 提供了有用的想法。
【问题讨论】:
-
当您进入谷歌并随着句子的继续输入一个长句子时,在每个单词之后,光标位置下方的每个单词都会出现一个自动完成下拉菜单。所以我需要一个类似的下拉列表,可以添加到 jQuery Autocomplete
-
@Explosion Pills - 这是一个简单的自动完成功能,我需要的是一个类似于 google 的功能(请参阅上面的评论),对我来说,即使是第二个单词的意思也会出现一个新的下拉列表,在你的小提琴中,如果我输入“word”,列表就会出现,但如果我在第一个“word”之后再次输入“word”,至少相同的下拉菜单也不会出现。
-
@JavierBrooklyn 你为什么要输入
word word?您的列表的来源是哪里? -
@Explosion Pills - 因为在您的小提琴中,所有数组都以单词开头。所以检查一个新词是否会出现一个新的下拉列表的唯一方法就是输入“word word”。在我的 js 中,我有一个数组,其中包含许多没有间隔的单词,如果我输入“hello world”,当我按下“h”时,我会得到一个包含以“h”开头的单词的下拉列表,以及一个包含以“开头的单词”的下拉列表w' 当我按'w'时。但是我的下拉列表中每个单词的框长度相同,但我希望框仅出现在光标下方和单词大小处。
标签: jquery jquery-ui autocomplete jquery-ui-autocomplete