Ja, Sie können, wenn Sie Affen-Patch automatisch vervollständigen.
In dem in v1.8rc3 der jQuery-Benutzeroberfläche enthaltenen Widget für die automatische Vervollständigung wird das Popup mit Vorschlägen in der Funktion _renderMenu des Widgets für die automatische Vervollständigung erstellt. Diese Funktion ist wie folgt definiert:
_renderMenu: function( ul, items ) {
var self = this;
$.each( items, function( index, item ) {
self._renderItem( ul, item );
});
},
Die Funktion _renderItem ist wie folgt definiert:
_renderItem: function( ul, item) {
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( "<a>" + item.label + "</a>" )
.appendTo( ul );
},
Sie müssen also das _renderItem fn durch Ihre eigene Kreation ersetzen, die den gewünschten Effekt erzeugt. Diese Technik, die eine interne Funktion in einer Bibliothek neu definiert, wird als Affen-Patching bezeichnet . So habe ich es gemacht:
function monkeyPatchAutocomplete() {
// don't really need this, but in case I did, I could store it and chain
var oldFn = $.ui.autocomplete.prototype._renderItem;
$.ui.autocomplete.prototype._renderItem = function( ul, item) {
var re = new RegExp("^" + this.term) ;
var t = item.label.replace(re,"<span style='font-weight:bold;color:Blue;'>" +
this.term +
"</span>");
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( "<a>" + t + "</a>" )
.appendTo( ul );
};
}
Rufen Sie diese Funktion einmal auf $(document).ready(...)
.
Nun, das ist ein Hack, weil:
Für jedes in der Liste gerenderte Element wird ein reguläres Ausdrucksobjekt erstellt. Dieses reguläre Ausdrucksobjekt sollte für alle Elemente wiederverwendet werden.
Für die Formatierung des fertigen Teils wird keine CSS-Klasse verwendet. Es ist ein Inline-Stil.
Das heißt, wenn Sie mehrere Autovervollständigungen auf derselben Seite hätten, würden alle die gleiche Behandlung erhalten. Ein CSS-Stil würde das lösen.
... aber es veranschaulicht die Haupttechnik und funktioniert für Ihre Grundanforderungen.
aktualisiertes Arbeitsbeispiel: http://output.jsbin.com/qixaxinuhe
Verwenden Sie diese Zeile, um die Groß- und Kleinschreibung der Übereinstimmungszeichenfolgen beizubehalten, anstatt die Groß- und Kleinschreibung der eingegebenen Zeichen zu verwenden:
var t = item.label.replace(re,"<span style='font-weight:bold;color:Blue;'>" +
"$&" +
"</span>");
Mit anderen Worten, von dem ursprünglichen Startcode oben, müssen Sie nur zu ersetzen , this.term
mit "$&"
.
BEARBEITEN
Das Obige ändert jedes Autocomplete-Widget auf der Seite. Wenn Sie nur eine ändern möchten, lesen Sie die folgende Frage:
Wie kann * nur eine * Instanz von Autocomplete auf einer Seite gepatcht werden?