Avant de me les indiquer, oui, j'ai examiné la demi-douzaine de messages sur ce sujet, mais je ne comprends toujours pas pourquoi cela ne fonctionne pas.
Mon objectif est de détecter lorsque la saisie semi-automatique donne 0 résultat. Voici le code:
$.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!'); }
})
}
});
La recherche elle-même fonctionne correctement, je peux faire apparaître les résultats sans problème. Si je comprends bien, je devrais être capable d'intercepter les résultats avec le gestionnaire de saisie semi-automatique ("result"). Dans ce cas, il ne se déclenche jamais du tout. (Même une alerte générique ou console.log qui ne fait pas référence au nombre de résultats ne se déclenche jamais). Le gestionnaire d'événements d'ouverture affiche le nombre correct de résultats (lorsqu'il y a des résultats), et les gestionnaires d'événements de recherche et de fermeture signalent une taille de résultat toujours en retard.
J'ai l'impression de manquer quelque chose d'évident et de flagrant ici, mais je ne le vois tout simplement pas.
la source
Réponses:
jQueryUI 1.9
jQueryUI 1.9 a béni le widget de saisie semi-automatique avec l'
response
événement, que nous pouvons exploiter pour détecter si aucun résultat n'a été renvoyé:Donc, dans cet esprit, le piratage que nous avons dû faire dans jQueryUI 1.8 est remplacé par:
Exemple: http://jsfiddle.net/andrewwhitaker/x5q6Q/
jQueryUI 1.8
Je n'ai pas trouvé de moyen simple de le faire avec l'API jQueryUI, cependant, vous pouvez remplacer la
autocomplete._response
fonction par la vôtre, puis appeler la fonction jQueryUI par défaut ( mise à jour pour étendre l'prototype
objet de la saisie semi-automatique ) :Et puis liez un gestionnaire d'événements à l'
autocompletesearchcomplete
événement (le contenu est le résultat de la recherche, un tableau):Ce qui se passe ici, c'est que vous enregistrez la
response
fonction de saisie semi-automatique dans une variable (__response
), puis que vous l'utilisezapply
pour la rappeler. Je ne peux imaginer aucun effet néfaste de cette méthode puisque vous appelez la méthode par défaut. Puisque nous modifions le prototype de l'objet, cela fonctionnera pour tous les widgets de saisie semi-automatique.Voici un exemple de travail : http://jsfiddle.net/andrewwhitaker/VEhyV/
Mon exemple utilise un tableau local comme source de données, mais je ne pense pas que cela devrait avoir de l'importance.
Mise à jour: vous pouvez également intégrer la nouvelle fonctionnalité dans son propre widget, étendant la fonctionnalité de saisie semi-automatique par défaut:
Modification de votre appel de
.autocomplete({...});
à:Et puis liez-vous à l'
autocompletesearchcomplete
événement personnalisé plus tard:Voir un exemple ici : http://jsfiddle.net/andrewwhitaker/VBTGJ/
Étant donné que cette question / réponse a attiré l'attention, j'ai pensé mettre à jour cette réponse avec une autre façon d'accomplir cela. Cette méthode est particulièrement utile lorsque vous n'avez qu'un seul widget de saisie semi-automatique sur la page. Cette façon de faire peut être appliquée à un widget de saisie semi-automatique qui utilise une source distante ou locale:
À l'intérieur de,
if
vous placeriez votre logique personnalisée à exécuter lorsqu'aucun résultat n'est détecté.Exemple: http://jsfiddle.net/qz29K/
Si vous utilisez une source de données distante, dites quelque chose comme ceci:
Ensuite, vous devrez modifier votre code afin de faire l'appel AJAX vous-même et de détecter le retour de 0 résultat:
la source
contents[0]
Tout le monde semble ignorer la méthode simple et intégrée: utilisez l'événement messages: noResults.
Cette fonctionnalité a été ajoutée dans jQuery 1.9, en tant que fonctionnalité expérimentale ( décrite ici ). En juillet 2017, il n'est pas encore documenté dans l'API .
la source
Si vous utilisez une source de données distante (comme une base de données MySQL, PHP ou autre côté serveur), il existe plusieurs autres moyens plus propres de gérer une situation où il n'y a pas de données à renvoyer au client (sans avoir besoin de hacks ou modifications du code de l'interface utilisateur du code principal).
J'utilise PHP et MySQL comme source de données distante et JSON pour transmettre des informations entre eux. Dans mon cas, j'ai semblé obtenir des erreurs d'exception jQuery si la demande JSON n'obtenait pas une sorte de réponse du serveur, donc j'ai trouvé plus facile de simplement renvoyer une réponse JSON vide du côté serveur lorsqu'il n'y a pas de données, puis de gérer le client réponse à partir de là:
Une autre façon serait de renvoyer un indicateur dans la réponse du serveur pour indiquer qu'il n'y a pas de données correspondantes et d'effectuer des actions côté client en fonction de la présence (et / ou de la valeur) de l'indicateur dans la réponse. Dans ce cas, la réponse des serveurs serait quelque chose comme:
Ensuite, sur la base de cet indicateur, des actions peuvent être effectuées côté client:
la source
Après avoir initialisé votre élément de saisie semi-automatique, définissez l'option messages si vous souhaitez utiliser les délais par défaut pour l'indication de message:
REMARQUE : il s'agit d'une API expérimentale (non documentée). Les développeurs de jQuery UI étudient toujours une solution complète pour la manipulation de chaînes et l'internationalisation.
la source
Après des heures à jouer, j'ai finalement trouvé une astuce à afficher
No match found
dans la saisie semi-automatique de jQuery. Regardez le code ci-dessus et ajoutez simplement undiv
, dans mon cas#ulNoMatch
et son style défini surdisplap:none
. Dans la méthode de réussite du rappel, vérifiez si le tableau renvoyé alength == 0
. Si c'est là vous y allez, vous avez fait votre journée! :)la source
Je ne vois pas pourquoi le
source
paramètre avec un rappel personnalisé ne suffit pas :la source
la source
la source