2009-07-29 7 views
1

Ich verwende das jquery-Autocomplete-Plug-in und versuche, die automatische Vervollständigung anhand bestimmter vom Benutzer eingegebener Tasten manuell auszulösen. Ich versuche, die automatische Vervollständigung an die Eingabe im laufenden Betrieb zu binden, damit die automatische Vervollständigung nach Übereinstimmungen suchen kann, sobald ein Benutzer eine bestimmte Taste zum Auslösen von "Ich gebe jetzt Daten zur Suche ein" eingibt, die in der Mitte sein könnte des Feldes, nicht unbedingt am Anfang.jquery keypress-Ereignis zum Auslösen der automatischen Vervollständigung nur für bestimmte Tastencodes

Ich verbinde ein Tastendruckereignis mit einem Eingang. Wenn der Benutzer einen bestimmten Schlüssel wie "=" eingibt, möchte ich alle Elemente im Array anzeigen. Wenn der Benutzer dann einen Buchstaben eingibt, würde er die Optionen automatisch vervollständigen, die mit dem Array für dieses Zeichen übereinstimmen. Dies versucht mehr oder weniger zu imitieren, was in Excel passiert, wenn ein Benutzer die Gleichheits-Taste drückt und die verfügbaren Funktionen sieht, außer die "=" - Taste muss nicht das erste Element in der Eingabe sein, sie sollte jedes Mal automatisch vervollständigt werden. = "wird jedes Mal, wenn eine Option ausgewählt wird, gedrückt und gelöst.

var array1 = ['one','two','three']; 

$.input1.bind('keypress', function(event) { 
    var keyCode; 
    if (event.keyCode > 0) { 
    keyCode = event.keyCode; 
    } else if (typeof(event.charCode) != "undefined") { 
    keyCode = event.charCode; 
    } 

    if (String.fromCharCode(keyCode) == '=') { 
    $.input1.unbind('keypress'); 

    $.input1.autocomplete(array1); 

    $.input1.blur(); 
    $.input1.focus(); 
    e = $.Event('keydown'); 
    e.which = keyCode; 
    $.input1.trigger(e); 
    } 

}); 

Selbst wenn ich die Autovervollständigung erhalten auszulösen, wenn der Benutzer etwas vor dem Text eingegeben hat, die passen könnten, wäre es nicht wegen des vorherigen Textes entsprechen. Wenn der Benutzer also "abd =" eingibt, erhält die Autovervollständigung "abb =" als ihren q-Parameter und nicht nur "=".

Jede Hilfe wird wirklich geschätzt, ich bin so fest !!

Antwort

4

Was Sie wirklich brauchen, ist in der Lage zu sein, den Wert des Feldes zu filtern, bevor das Autocomplete-Plugin die Suche durchführt. Wenn man das Plugin betrachtet, sieht es nicht so aus, als wäre es eingebaut. ABER das hindert uns nicht, es hinzuzufügen.

Öffnen Sie das Plugin-Code und die Funktion Lastword finden(), Blick auf Linie 261. Dann ist diese zu dieser Funktion hinzufügen:

if (options.formatValue){ 
    value = options.formatValue(value); 
} 

So ist die Lastword Funktion sollte wie folgt aussehen:

function lastWord(value) { 
    if (options.formatValue){ 
     value = options.formatValue(value); 
    } 
    if (!options.multiple) 
     return value; 
    var words = trimWords(value); 
    return words[words.length - 1]; 
} 

Dann in Ihrem jQuery-Code können Sie etwas tun:

$(document).ready(function(){ 
    var array1 = ['one','two','three']; 
    $('#test').autocomplete(array1,{ 
       formatValue: function(value){ 
        if (value.search('=') == -1) return ''; 
        return value.substring(value.search('=')+1); 
       } 
    }); 
}); 

Dies wird Ihnen lassen Filtern und formatieren Sie den Wert des Feldes vor der Suche. Da Sie nur suchen wollen, wenn der Wert das Zeichen "=" hat, suchen Sie danach, und wenn Sie nicht gefunden haben, geben Sie eine leere Zeichenfolge zurück. Wenn es gefunden wird, entferne du es und alles davor und gib zurück, was der Benutzer hinterher schreibt.

+0

hey petersendidit, Vielen Dank für die Antwort. Nachdem ich 2 Tage lang gefummelt hatte, dachte ich, dass es eine Anpassung an das Plugin selbst geben musste. Meine Anforderungen sind etwas komplizierter geworden. Eine Funktion hat Parameter und alle Parameter sind Autocompletes für andere Arrays. Eine Funktion namens "functionX" hätte also eine Form von "function()", die mit dem "=" oder einer Form von "[param]" angezeigt würde. Wenn der Benutzer die "[" - Taste drückt, würde die automatische Vervollständigung dann ändern, um nach dem Array dieses Parameters zu suchen.Wenn der Benutzer also "abc [" eingeben würde, würde er sich dann den anderen anschauen. –

+0

Also jede Funktion hat 2 Formen, 1 Form ist wie functionName(), die alle angezeigt würden, wenn der Benutzer "=" trifft, und die andere Form, die nur ein enclosureStart char und enclosureEnd char ist. Wenn also der Benutzer die Taste "[" in meinem Beispiel drückt, sollten keine Ergebnisse zurückkommen, aber beim nächsten Schlüssel sollte der Benutzer Ergebnisse vom Parameter der Funktion "Autocomplete" sehen. Macht das irgendeinen Sinn? Ich kann Ihnen einen detaillierten Anwendungsfall mailen, wenn ich es klarer machen könnte ... Nochmals vielen Dank für die Hilfe! –

1

Sie können Ihre autocomplete.js ändern, indem die zweite Codezeile hinzugefügt

... 
    .bind("keydown.autocomplete", function(event) { 
+ self.options.keydownEvent=event; 
    if (self.options.disabled) {... 

Dann verweisen Sie auf keydownEvent in Ihrem sorce Funktion wie diese

source:function(){ 
var event=this.options.keydownEvent; 
... //Handling the event 

Denken Sie daran, dass die var Ereignis a hat welches Feld. Zum Beispiel, wenn event.which 13 ist, dann wurde die Taste Enter gedrückt. Ich hoffe es hilft.