2016-07-01 10 views
-1

Ich habe eine jQuery Autocomplete für Flughäfen. Mein Datensatz enthält Label und Wert. Probe:jQuery Autocomplete, um genaue Übereinstimmung zu finden

var Airports = [ 
    { "label": "DMB - Dzhambyl, Dzhambyl Airport", "value": "DMB" }, 
    { "label": "EMA - Nottingham, Nottingham East Midlands Airport", "value": "EMA" }, 
    { "label": "HAM - Hamburg, Hamburg Airport", "value": "HAM" }  
]; 

Als ich HAM eingeben (die die 3LC für Hamburg Airport ist) ich zur Zeit alle diese drei Elemente als Ergebnis. Ich möchte aber nur "HAM - Hamburg, Hamburg Airport" sehen, wenn der Wert dieses Artikels genau der Suchanfrage entspricht. Es sollte auch möglich sein, alle Einträge mit z.B. "Burg" drin, wenn ich danach suchen würde.

Demo: https://jsfiddle.net/SchweizerSchoggi/pguoa197/1/

+0

in der jQuery Autocomplete API-Dokumentation http://api.jqueryui.com/ Autocomplete/Es gibt ein Beispiel, das zeigt, wie am Anfang des Textes abgeglichen wird. –

+0

Ja, aber beides sollte möglich sein. Wenn ich "Suche vom Anfang des Textes" verwende, dann finde ich HAM-Hamburg, aber keine Einträge mit "burg" in der Mitte des Textes, wenn ich nach dem suchen würde. – SchweizerSchoggi

+0

Sie wollen also auf den Wert abstimmen, wenn es genau ist hit, sonst passt auf den Text? Ändern Sie in diesem Fall die Quellfunktion, um dieses Verhalten bereitzustellen. –

Antwort

0

Sie nicht wissen, wer diese Frage überstimmte und warum ... aber hier ist die Lösung für: In diesem Fall können Sie Ihre eigene Filtermethode für das Auto-Vervollständigen, wie diese erstellen wer wird jemals etwas ähnliches in der Zukunft brauchen:

$(function() { 
    var Airports = [ 
     { "label": "DMB - Dzhambyl, Dzhambyl Airport", "value": "DMB" }, 
     { "label": "EMA - Nottingham, Nottingham East Midlands Airport", "value": "EMA" }, 
     { "label": "HAM - Hamburg, Hamburg Airport", "value": "HAM" }  
    ]; 


$("#depart").autocomplete({ 
    source: function (request, response) { 
     var term = $.ui.autocomplete.escapeRegex(request.term) 
      , startsWithMatcher = new RegExp("^" + term, "i") 
      , startsWith = $.grep(Airports, function(value) { 
       return startsWithMatcher.test(value.label || value.value || value); 
      }) 
      , containsMatcher = new RegExp(term, "i") 
      , contains = $.grep(Airports, function (value) { 
       return $.inArray(value, startsWith) < 0 && 
        containsMatcher.test(value.label || value.value || value); 
      }); 

      response(startsWith.concat(contains)); 
    }, 
    minLength: 3 
    }); 
}); 

funktionstüchtiges Beispiel: https://jsfiddle.net/SchweizerSchoggi/pguoa197/5/

+0

Ich sehe nicht, wie dies eine Lösung ist, da es genau das gleiche Ergebnis wie der Code in der Frage zeigt. Wenn Sie "HAM" nur in der Liste nach oben verschieben möchten, können Sie eine benutzerdefinierte Sortierung festlegen. –

+0

Es ist nicht dasselbe. Wenn du HAM betrittst, kommt Hamburg zuerst (zusammen mit 3LC), dann der Rest. In der Erstbemusterung war Hamburg auf Position 3 nur – SchweizerSchoggi

+0

In diesem Fall mussten Sie nur eine benutzerdefinierte Sortierung implementieren. Deine Frage beinhaltet, dass du nur nach den ersten Charakteren filtern wolltest - 'Aber ich möchte nur" HAM - Hamburg, Hamburg Airport "sehen, wenn der Wert dieses Artikels der genauen Suchanfrage entspricht –

0

Von der Problembeschreibung klingt es wie Sie von Anfang an der Wertzeichenfolge übereinstimmen soll.

$.ui.autocomplete.filter = function (array, term) { 
    var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i"); 
    return $.grep(array, function (value) { 
     return matcher.test(value.label || value.value || value); 
    }); 
}; 

Updated fiddle

+0

Thx Rory, für Hamburg (Schinken) das funktioniert gut Es sollte aber auch möglich sein, zB "Nottingham" zu finden. Das ist jetzt nicht mehr der Fall – SchweizerSchoggi

+0

Ich fürchte, es ist das eine oder das andere. 'Ham' ist ein gültiger Teil beider Strings und wird bei der Suche angezeigt. –

+0

es funktioniert jetzt, siehe meine Antwort oben :-) – SchweizerSchoggi

Verwandte Themen