jQueryUI自动完成-和/或选择中的条件
我用from作为基础。这正是我需要它做的,除了我需要能够有或有条件。我制作了一把小提琴作为演示: 我的问题是:演示项目包括汽车、电话和带电话的汽车。有没有办法让autocomplete处理三种情况:字符串包含大小写(默认值),后跟and大小写,最后是OR大小写?因此,如果我输入“车载电话”,将导致: 1) 第一个case-0结果为“carphone”不是任何标签的子字符串 2) 第二个案例-1的结果是因为“Car”和“Phone”出现在“Car With Phone”中。这将添加到前面的0结果下面的列表中 3) 第三种情况-显示更多的结果,因为标签“Car”和“Phone”至少包含一个搜索项。这些结果显示在阶段1和阶段2以前的结果下面,因此下面的选择框现在应该呈现: 带电话的汽车 汽车 电话(汽车和电话订单真的不重要,因为它们都是同样正确的) 下面是讨论中的javascript:jQueryUI自动完成-和/或选择中的条件,jquery,jquery-ui,Jquery,Jquery Ui,我用from作为基础。这正是我需要它做的,除了我需要能够有或有条件。我制作了一把小提琴作为演示: 我的问题是:演示项目包括汽车、电话和带电话的汽车。有没有办法让autocomplete处理三种情况:字符串包含大小写(默认值),后跟and大小写,最后是OR大小写?因此,如果我输入“车载电话”,将导致: 1) 第一个case-0结果为“carphone”不是任何标签的子字符串 2) 第二个案例-1的结果是因为“Car”和“Phone”出现在“Car With Phone”中。这将添加到前面的0结果
$(document).ready(function() {
$( "#topics" ).autocomplete({
minLength: 1,
source: topics,
focus: function( event, ui ) {
$( "#topics" ).val( ui.item.label );
return false;
},
select: function( event, ui ) {
$( "#topics" ).val( ui.item.label );
$("#topicID").val(ui.item.id);
$( "#results").text($("#topicID").val());
return false;
}
})
});
那么,是否有可能按顺序进行:
1) string.contains(默认值)
2) 字符串拆分-->和条件
3) 字符串拆分-->或条件(不偏好按包含的术语数量排序)我们需要做的是在数据上搜索“AND”和“OR”结果。我的第一个想法是使用autoselect的
response
事件来实现这一点,并将结果添加到库本身收集的结果中。然而,在写这篇文章时,我意识到无论如何我都必须进行正常的搜索,以防止结果出现两次。相反,我将为source
属性指定一个函数,并自己进行所有排序
(使用前面的方法,我还遇到了一个jQueryUI错误(新的消息显示找到了多少个结果),但没有采用新的方法。)
好的,从这里开始就很简单了,让我来展示一下代码:
var topics = [
{
value: "carphone",
label: "Car With Phone",
id: "1"},
{
value: "car",
label: "Car",
id: "2"},
{
value: "phone",
label: "Phone",
id: "3"}
];
$(document).ready(function() {
$("#topics").autocomplete({
minLength: 1,
focus: function(event, ui) {
$("#topics").val(ui.item.label);
return false;
},
select: function(event, ui) {
$("#topics").val(ui.item.label);
$("#topicID").val(ui.item.id);
$("#results").text($("#topicID").val());
return false;
},
source: function(request, response) {
var fullResults = [];
var andResults = [];
var orResults = [];
var fullNeedle = request.term;
var needles = $.grep(fullNeedle.split(" "), function(element) {
return element !== '';
});
$.each(topics, function(key, topic) {
var found = 0;
$.each(needles, function(needleKey, needle) {
if (topic.label.toLowerCase().indexOf(needle.toLowerCase()) != -1) {
found++;
}
});
if (topic.label.toLowerCase().indexOf(fullNeedle.toLowerCase()) != -1) {
fullResults.push(topic);
}
else if (found == needles.length) {
andResults.push(topic);
}
else if (found > 0) {
orResults.push(topic);
}
});
$.merge(fullResults, andResults);
$.merge(fullResults, orResults);
response(fullResults);
}
});
});
一点解释:我们不再把我们的主题作为源代码提供给图书馆,而是在自己搜索时为自己保留源代码。我们使用三个数组来实现这一点,每个数组将包含三种结果类型中的一种,因此我们可以保持正确的顺序。最后,在填充完这三个数组后,我们合并它们。您所说的“ANDed”和所有这些是什么意思?“因此,如果我输入“汽车电话”,它将尝试ANDed案例(0个结果),然后跟进OR案例…”这是相当模糊的…抱歉,我在评论中添加了,但没有修改第一部分。基本上,在空间上拆分字符串,然后用ANDs搜索。所以Car和Phone都出现在字符串“Car With Phone”中,这样它们就可以通过了。我也会编辑上面的部分,谢谢。我想你必须按照相反的顺序来做。。第一个测试(如您所说的string.contains)的结果总是
true
,因此其他两个测试将永远无法进行。我不确定当时是否正确地进行了通信。“Hello out there”包含“out there”,所以这是真的,但不包含“there out”或“Hello there”(“Hello there”序列不会出现在“Hello out there”中的任何地方,因为“out”正在阻塞)。然而,“Hello there”将通过AND和OR条件(但它将通过AND从检查列表中删除),这起作用,使我处于一个很好的位置,可以应用逻辑过滤和/或更改列表,正如昨天我注意到的那样。我在使用grep时看到了一个非常类似的选项,但它涉及的正则表达式我对此一无所知(它也没有真正处理单独的案例场景)。这完全符合需要,一个很大的好处是我需要加入一些逻辑(通过表单上的控件过滤列表,但如果没有结果,则从另一个列表中提取,等等)。完美的