#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" />
решена моя проблема