Antes de você me apontar para eles, sim, eu revi meia dúzia de postagens sobre este tópico, mas ainda não consigo entender por que isso não funciona.
Meu objetivo é detectar quando o preenchimento automático produz 0 resultados. Aqui está o código:
$.ajax({
url:'sample_list.foo2',
type: 'get',
success: function(data, textStatus, XMLHttpRequest) {
var suggestions=data.split(",");
$("#entitySearch").autocomplete({
source: suggestions,
minLength: 3,
select: function(e, ui) {
entityAdd(ui.item.value);
},
open: function(e, ui) {
console.log($(".ui-autocomplete li").size());
},
search: function(e,ui) {
console.log("search returned: " + $(".ui-autocomplete li").size());
},
close: function(e,ui) {
console.log("on close" + $(".ui-autocomplete li").size());
$("#entitySearch").val("");
}
});
$("#entitySearch").autocomplete("result", function(event, data) {
if (!data) { alert('nothing found!'); }
})
}
});
A pesquisa em si funciona bem, posso fazer com que os resultados apareçam sem problemas. Pelo que entendi, devo ser capaz de interceptar os resultados com o manipulador de preenchimento automático ("resultado"). Nesse caso, ele nunca dispara. (Mesmo um alerta genérico ou console.log que não faz referência ao número de resultados nunca dispara). O manipulador de eventos open mostra o número correto de resultados (quando há resultados), e os manipuladores de eventos search e close relatam um tamanho de resultado que está sempre um passo atrás.
Eu sinto que estou perdendo algo óbvio e gritante aqui, mas eu simplesmente não vejo isso.
fonte
Respostas:
jQueryUI 1.9
jQueryUI 1.9 abençoou o widget de preenchimento automático com o
response
evento, que podemos aproveitar para detectar se nenhum resultado foi retornado:Então, com isso em mente, o hacking que tivemos que fazer no jQueryUI 1.8 foi substituído por:
Exemplo: http://jsfiddle.net/andrewwhitaker/x5q6Q/
jQueryUI 1.8
Não consegui encontrar uma maneira direta de fazer isso com a API jQueryUI, no entanto, você pode substituir a
autocomplete._response
função pela sua própria e, em seguida, chamar a função jQueryUI padrão ( atualizada para estender oprototype
objeto do preenchimento automático ) :E, em seguida, vincule um manipulador de
autocompletesearchcomplete
eventos ao evento (o conteúdo é o resultado da pesquisa, uma matriz):O que está acontecendo aqui é que você está salvando a
response
função de preenchimento automático em uma variável (__response
) e usandoapply
para chamá-la novamente. Não consigo imaginar nenhum efeito negativo desse método, já que você está chamando o método padrão. Como estamos modificando o protótipo do objeto, isso funcionará para todos os widgets de preenchimento automático.Aqui está um exemplo prático : prático http://jsfiddle.net/andrewwhitaker/VEhyV/
Meu exemplo usa uma matriz local como fonte de dados, mas não acho que isso deva importar.
Atualização: você também pode envolver a nova funcionalidade em seu próprio widget, estendendo a funcionalidade de preenchimento automático padrão:
Alterando sua chamada de
.autocomplete({...});
para:E depois vincule ao
autocompletesearchcomplete
evento personalizado :Veja um exemplo aqui : http://jsfiddle.net/andrewwhitaker/VBTGJ/
Como essa pergunta / resposta recebeu alguma atenção, pensei em atualizar esta resposta com outra maneira de fazer isso. Este método é mais útil quando você tem apenas um widget de preenchimento automático na página. Essa maneira de fazer isso pode ser aplicada a um widget de preenchimento automático que usa uma fonte remota ou local:
Dentro do
if
é onde você colocaria sua lógica customizada para executar quando nenhum resultado fosse detectado.Exemplo: http://jsfiddle.net/qz29K/
Se você estiver usando uma fonte de dados remota, diga algo assim:
Em seguida, você precisará alterar seu código para que você mesmo faça a chamada AJAX e possa detectar quando nenhum resultado voltar:
fonte
contents[0]
Todos parecem estar ignorando a maneira fácil e embutida: use o evento messages: noResults.
Este recurso foi adicionado no jQuery 1.9, como um recurso experimental ( descrito aqui ). Em julho de 2017, ainda não estava documentado na API .
fonte
Se você estiver usando uma fonte de dados remota (como um banco de dados MySQL, PHP ou qualquer outro no lado do servidor), existem algumas outras maneiras mais limpas de lidar com uma situação em que não há dados para retornar ao cliente (sem a necessidade de nenhum hacks ou alterações de código de IU do código principal).
Eu uso PHP e MySQL como minha fonte de dados remota e JSON para passar informações entre eles. No meu caso, parecia que recebia erros de exceção do jQuery se a solicitação JSON não obtivesse algum tipo de resposta do servidor, então achei mais fácil apenas retornar uma resposta JSON vazia do lado do servidor quando não há dados e, em seguida, lidar com o cliente resposta de lá:
Outra forma seria retornar um sinalizador na resposta do servidor para indicar que não há dados correspondentes e realizar ações no lado do cliente com base na presença (e / ou valor) do sinalizador na resposta. Nesse caso, a resposta do servidor seria algo como:
Então, com base neste sinalizador, as ações podem ser realizadas no lado do cliente:
fonte
Depois de inicializar o elemento autocomplete, defina a opção de mensagens se quiser usar os spans padrão para indicação de mensagem:
NOTA : Esta é uma API experimental (não documentada). Os desenvolvedores do jQuery UI ainda estão investigando uma solução completa para manipulação de strings e internacionalização.
fonte
Depois de horas jogando, finalmente encontrei um truque para exibir
No match found
no autocomplete jQuery. Observe o código acima e simplesmente adicione adiv
, no meu caso#ulNoMatch
e seu estilo definido comodisplap:none
. No método de sucesso de retorno de chamada, verifique se o array retornado temlength == 0
. Se for lá, você fez o seu dia! :)fonte
Não vejo por que o
source
parâmetro com um retorno de chamada personalizado não é suficiente:fonte
fonte
fonte