Автозаполнение пользовательского интерфейса jQuery — сообщение без результатов

#jquery #laravel

#javascript #jquery #jquery-ui #автозаполнение #jquery-автозаполнение

Вопрос:

Я пытаюсь отобразить сообщение «Без результатов» в выпадающем меню, если результатов нет. Так, например, если я ввожу «ABCD» в текстовое поле, и нет объекта, который соответствует, сообщение «Нет результатов». будет отображаться.

Просмотрев stackoverflow для различных способов достижения этой цели и попробовав несколько из них, я все еще не могу заставить его работать.

Как я могу добавить сообщение «Без результатов» в выпадающее меню, если результаты не найдены?

jQuery:

     $element.autocomplete({
        source: function (request, response) {            
            $.ajax({
                url: thUrl   thQS,
                type: "get",
                dataType: "json",
                cache: false,
                data: {
                    featureClass: "P",
                    style: "full",
                    maxRows: 12
                },
                success: function (data) {
                    response($.map(data, function (item) {
                        if (data.indexOf(item) === -1) {
                            return { label: "No Results." }
                        } else {
                            return {
                                label: item.Company   " ("   item.Symbol   ")",
                                value: item.Company
                            }
                        }
                    }));
                }
            });
        },
        minLength: that.options.minLength,
        select: function (event, ui) {
               reRenderGrid();
        }
    });
  

Я попытался добавить оператор if() со следующим, но это не сработало.

 if (data.length === 0) {
    // Do logic for empty result.
}
  

Я могу перезаписать первую запись текстом «Без результата», если я сделаю следующее…

 if (data.indexOf(item) === 0) {
    return { 
        label: "No Results." 
}
  

… но если я установил data.indexOf(item) === -1 , ничего не отображается.

Я только недавно попробовал следующее, и когда данных нет, он переходит в цикл, однако «Нет результатов» не отображается в меню:

    success: function (data) {
        response($.map(data, function (item) {
            return {
                label: item.Company   " ("   item.Symbol   ")",
                value: item.Company
            }
        }));
        if (data.length === 0) {
            label: "No Results."
        }
    }
  

Я также пытался использовать приведенный ниже пример от Эндрю Уитакера, но безуспешно:

СКРИПКА ЭНДРЮ УИТАКЕРА:http://jsfiddle.net/J5rVP/128 /

ИСТОЧНИК:http://blog.andrewawhitaker.com/2012/10/08/jqueryui-autocomplete-1-9 /

Ответ №1:

 if (!ui.content.length) {
    var noResult = { value:"",label:"No results found" };
    ui.content.push(noResult);
    //$("#message").text("No results found");
} 
  

Скрипка

http://jsfiddle.net/J5rVP/129/

Обновить

Поместите код в конце вашей автоматической настройки сразу после select: function (event, ui) {..}

     ..........
    minLength: that.options.minLength,
    select: function (event, ui) {
        reRenderGrid();
    },   //HERE - make sure to add the comma after your select
    response: function(event, ui) {
        if (!ui.content.length) {
            var noResult = { value:"",label:"No results found" };
            ui.content.push(noResult);
        }
    }
});
  

Комментарии:

1. Спасибо за ответ, Тревор. Я заметил, что вы отредактировали скрипку Эндрю Уитакера, однако его скрипка не совсем такая, как моя. Куда бы я поместил ваш приведенный выше код? Где-то в моем операторе выбора? Можете ли вы создать скрипку, используя только мой код?

2. Привет, Тревор. Я пробовал, но это не сработало. Я не могу не думать, что это потому, что у меня уже есть ответ. Итак, если первый ответ в заявлении об успешном завершении будет успешным, будет ли он также выполнять второй ответ под оператором select? В моем случае это даже не дошло до инструкции. Я ввел точку останова, и она никогда не останавливалась.

3. @Keven Ну, я не знаю, что вам сказать, если вы не можете получить рабочий пример скрипта с вашим кодом.. Это не other response Вот еще одна скрипка, которая очень похожа на мою первую скрипку, за исключением того, как я настраиваю функцию успеха ajax, похожую на вашу. jsfiddle.net/J5rVP/130 Постарайтесь максимально приблизить свой код к формату fiddle.

4. Требуется ли для использования «ответа» определенная версия jQuery? Я не могу заставить это работать в 1.8.17 — код ответа никогда не попадает, но ошибок JS нет.

5. @NickG Я в это не верю, я протестировал это, используя свою скрипку на jQuery 1.7.2, и «ответ» был запущен. Возможно, это ваша версия пользовательского интерфейса jQuery?

Ответ №2:

Измените функцию следующим образом, чтобы проверить длину данных.

 success: function (data) {
    if(!data.length){
        var result = [
            {
                label: 'No matches found', 
                value: response.term
            }
        ];
        response(result);
    }
    else{
        // normal response
        response($.map(data, function (item) {
            return {
                label: item.CompanyName   " ("   item.SymbolName   ")",
                value: item.CompanyName
            }
        }));
    }
}
  

Комментарии:

1. Но пользователь может выбирать No matches found , и это неправильно, я не понимаю, почему люди используют эти типы обходных путей.

2. Это легко исправить в функции выбора (события, пользовательский интерфейс).

Ответ №3:

Мой ответ почти идентичен ответам @neelmeg и @Trever, но я добавил дополнительную проверку, поэтому пользователь не сможет выбрать сообщение «без результата»:

 $(".my-textbox").autocomplete({
    minLength: 2,
    open: function () { $('.ui-autocomplete').css('z-index', 50); },
    source: function (request, response) {
        $.ajax({
            url: "/some-url",
            type: "POST",
            dataType: "json",
            data: { prefix: request.term, __RequestVerificationToken: token },
            success: function (data) {
                if (!data.length) {
                    var result = [{ label: "no results", value: response.term }];
                    response(result);
                }
                else {
                    response($.map(data, function (item) {
                        return { label: item.someLabel, value: item.someValue };
                    }))
                }
            }
        })
    },
    select: function (event, ui) {
        var label = ui.item.label;
            if (label === "no results") {
            // this prevents "no results" from being selected
            event.preventDefault();
        }
        else {
            /* do something with the selected result */
            var url = "some-url"
            window.location.href = url;
        }
    }
});
  

Ответ №4:

Для меня причиной появления этих сообщений были:

 MISSING CSS FILES O JQUERY UI 
  

итак, добавление:

 <link rel="stylesheet" href="jqueryui/themes/flick/jquery-ui.css" type="text/css" media="screen" />
<link rel="stylesheet" href="jqueryui/themes/flick/jquery.ui.theme.css" type="text/css" media="screen" />
  

решена моя проблема