Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQueryUI自动完成-和/或选择中的条件_Jquery_Jquery Ui - Fatal编程技术网

jQueryUI自动完成-和/或选择中的条件

jQueryUI自动完成-和/或选择中的条件,jquery,jquery-ui,Jquery,Jquery Ui,我用from作为基础。这正是我需要它做的,除了我需要能够有或有条件。我制作了一把小提琴作为演示: 我的问题是:演示项目包括汽车、电话和带电话的汽车。有没有办法让autocomplete处理三种情况:字符串包含大小写(默认值),后跟and大小写,最后是OR大小写?因此,如果我输入“车载电话”,将导致: 1) 第一个case-0结果为“carphone”不是任何标签的子字符串 2) 第二个案例-1的结果是因为“Car”和“Phone”出现在“Car With Phone”中。这将添加到前面的0结果

我用from作为基础。这正是我需要它做的,除了我需要能够有或有条件。我制作了一把小提琴作为演示:

我的问题是:演示项目包括汽车、电话和带电话的汽车。有没有办法让autocomplete处理三种情况:字符串包含大小写(默认值),后跟and大小写,最后是OR大小写?因此,如果我输入“车载电话”,将导致:

1) 第一个case-0结果为“carphone”不是任何标签的子字符串

2) 第二个案例-1的结果是因为“Car”和“Phone”出现在“Car With Phone”中。这将添加到前面的0结果下面的列表中

3) 第三种情况-显示更多的结果,因为标签“Car”和“Phone”至少包含一个搜索项。这些结果显示在阶段1和阶段2以前的结果下面,因此下面的选择框现在应该呈现:

带电话的汽车

汽车

电话(汽车和电话订单真的不重要,因为它们都是同样正确的)

下面是讨论中的javascript:

$(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时看到了一个非常类似的选项,但它涉及的正则表达式我对此一无所知(它也没有真正处理单独的案例场景)。这完全符合需要,一个很大的好处是我需要加入一些逻辑(通过表单上的控件过滤列表,但如果没有结果,则从另一个列表中提取,等等)。完美的