Bevor Sie mich darauf hinweisen, habe ich das halbe Dutzend Beiträge zu diesem Thema überprüft, aber ich bin immer noch nicht sicher, warum dies nicht funktioniert.
Mein Ziel ist es zu erkennen, wann die automatische Vervollständigung 0 Ergebnisse liefert. Hier ist der 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!'); }
})
}
});
Die Suche selbst funktioniert einwandfrei. Ich kann problemlos Ergebnisse anzeigen. So wie ich es verstehe, sollte ich in der Lage sein, die Ergebnisse mit dem Autocomplete-Handler ("Ergebnis") abzufangen. In diesem Fall wird es überhaupt nicht ausgelöst. (Selbst eine generische Warnung oder ein console.log, das nicht auf die Anzahl der Ergebnisse verweist, wird nie ausgelöst.) Der Open Event Handler zeigt die richtige Anzahl von Ergebnissen an (wenn Ergebnisse vorliegen), und der Search und Close Event Handler gibt eine Ergebnisgröße an, die immer einen Schritt zurückliegt.
Ich habe das Gefühl, dass mir hier etwas Offensichtliches und Auffälliges fehlt, aber ich sehe es einfach nicht.
quelle
Antworten:
jQueryUI 1.9
jQueryUI 1.9 hat das Widget für die automatische Vervollständigung mit dem
response
Ereignis gesegnet , mit dem wir feststellen können, ob keine Ergebnisse zurückgegeben wurden:In diesem Sinne wird das Hacking, das wir in jQueryUI 1.8 durchführen mussten, ersetzt durch:
Beispiel: http://jsfiddle.net/andrewwhitaker/x5q6Q/
jQueryUI 1.8
Ich konnte mit der jQueryUI-API keinen einfachen Weg finden, dies zu tun. Sie könnten jedoch die
autocomplete._response
Funktion durch Ihre eigene ersetzen und dann die Standardfunktion jQueryUI aufrufen ( aktualisiert, um dasprototype
Objekt der automatischen Vervollständigung zu erweitern ) :Binden Sie dann einen Ereignishandler an das
autocompletesearchcomplete
Ereignis (Inhalt ist das Ergebnis der Suche, ein Array):Was hier passiert ist, dass Sie die
response
Funktion der automatischen Vervollständigung in einer Variablen (__response
) speichern und dann verwendenapply
, um sie erneut aufzurufen. Ich kann mir keine negativen Auswirkungen dieser Methode vorstellen, da Sie die Standardmethode aufrufen. Da wir den Prototyp des Objekts ändern, funktioniert dies für alle Widgets mit automatischer Vervollständigung.Hier ist ein funktionierendes Beispiel : http://jsfiddle.net/andrewwhitaker/VEhyV/
In meinem Beispiel wird ein lokales Array als Datenquelle verwendet, aber ich denke nicht, dass dies von Bedeutung sein sollte.
Update: Sie können die neue Funktionalität auch in ein eigenes Widget einbinden und die Standardfunktion für die automatische Vervollständigung erweitern:
Ändern Ihres Anrufs von
.autocomplete({...});
:Und binden Sie später an das benutzerdefinierte
autocompletesearchcomplete
Ereignis:Ein Beispiel finden Sie hier : http://jsfiddle.net/andrewwhitaker/VBTGJ/
Da diese Frage / Antwort einige Aufmerksamkeit erhalten hat, dachte ich, ich würde diese Antwort mit einer weiteren Möglichkeit aktualisieren, um dies zu erreichen. Diese Methode ist am nützlichsten, wenn Sie nur ein Widget für die automatische Vervollständigung auf der Seite haben. Diese Methode kann auf ein Widget für die automatische Vervollständigung angewendet werden, das eine Remote- oder lokale Quelle verwendet:
In diesem Bereich platzieren
if
Sie Ihre benutzerdefinierte Logik, die ausgeführt werden soll, wenn keine Ergebnisse erkannt werden.Beispiel: http://jsfiddle.net/qz29K/
Wenn Sie eine entfernte Datenquelle verwenden, sagen Sie Folgendes:
Dann müssen Sie Ihren Code ändern, damit Sie den AJAX selbst aufrufen und erkennen können, wann 0 Ergebnisse zurückkommen:
quelle
contents[0]
Jeder scheint die einfache, integrierte Methode zu ignorieren: Verwenden Sie das Ereignis messages: noResults.
Diese Funktion wurde in jQuery 1.9 als experimentelle Funktion hinzugefügt ( hier beschrieben ). Zum Juli 2017 ist es noch nicht in der API dokumentiert .
quelle
Wenn Sie eine entfernte Datenquelle verwenden (z. B. eine MySQL-Datenbank, PHP oder was auch immer auf der Serverseite), gibt es einige andere sauberere Möglichkeiten, um mit einer Situation umzugehen, in der keine Daten an den Client zurückgegeben werden müssen (ohne dass dies erforderlich ist) Hacks oder Änderungen des UI-Codes des Kerncodes).
Ich verwende PHP und MySQL als Remote-Datenquelle und JSON, um Informationen zwischen ihnen zu übertragen. In meinem Fall schien es zu jQuery-Ausnahmefehlern zu kommen, wenn die JSON-Anforderung keine Antwort vom Server erhielt. Daher war es für mich einfacher, einfach eine leere JSON-Antwort von der Serverseite zurückzugeben, wenn keine Daten vorhanden sind, und dann den Client zu behandeln Antwort von dort:
Eine andere Möglichkeit wäre, ein Flag in der Antwort vom Server zurückzugeben, um anzuzeigen, dass keine übereinstimmenden Daten vorhanden sind, und Aktionen auf der Clientseite basierend auf dem Vorhandensein (und / oder Wert) des Flags in der Antwort auszuführen. In diesem Fall lautet die Antwort des Servers wie folgt:
Basierend auf diesem Flag können dann Aktionen clientseitig ausgeführt werden:
quelle
Legen Sie nach dem Initialisieren Ihres Autocomplete-Elements die Option messages fest, wenn Sie die Standardbereiche für die Nachrichtenanzeige verwenden möchten:
HINWEIS : Dies ist eine experimentelle API (nicht dokumentiert). Entwickler der jQuery-Benutzeroberfläche untersuchen derzeit noch eine vollständige Lösung für die Manipulation und Internationalisierung von Zeichenfolgen.
quelle
Nach stundenlangem Spielen habe ich endlich einen Trick gefunden, der
No match found
in jQuery Autocomplete angezeigt werden kann . Schauen Sie sich den obigen Code an und fügen Sie einfach einen hinzudiv
, in meinem Fall#ulNoMatch
und dessen Stil aufdisplap:none
. Überprüfen Sie in der Callback Success-Methode, ob das zurückgegebene Array hatlength == 0
. Wenn es da ist, hast du deinen Tag gemacht! :) :)quelle
Ich verstehe nicht, warum
source
Parameter mit einem benutzerdefinierten Rückruf nicht ausreichen:quelle
quelle
quelle