Thomas Bandt

Über mich | Kontakt | Archiv

Workaround: jQuery UI Autocomplete - Postback ohne Auswahl

jQuery UI bietet seit einiger Zeit ein "Autocomplete-Widget" an, mit dem man den mittlerweile ja auch von Google bekannten Effekt erzielen kann, dass noch während des Tippens innerhalb einer Textbox Vorschläge gemacht werden. Wie das Ganze mit ASP.NET MVC kombiniert verwendet werden kann, hat Alexander Zeitler erst kürzlich demonstriert.

Mir ging das noch nicht weit genug, ich wollte noch die Möglichkeit bekommen, per Enter bei Auswahl eines Vorschlags das  Formular automatisch abzuschicken. Das lässt sich mit Hilfe des Select-Events auch sehr einfach erreichen. Doof nur, dass damit ein unangenehmer Effekt auftritt:

Wählt man nämlich keinen der angezeigten Vorschläge aus und drückt Enter, passiert nichts. Ziemlich doof, vor allem wenn man ein Wort bereits fertig getippt hat, dass dann womöglich in der Liste erscheint - das will man ja normalerweise nicht noch extra auswählen müssen.

Das Event wird schlichtweg abgefangen und ignoriert. Glaubt man den Entwicklern, ist dies ein bewusst gewähltes Verhalten, was sich aber in Zukunft ändern wird.

Abilfe schafft eine Funktion, die man ans KeyPress-Event der Textbox dranhängt, und mit welcher man analog zum Select-Event der AutoComplete-Funktion das Formular einfach selbst abschickt. Nachfolgend ein komplettes Beispiel.

   1:  <script type="text/javascript">
   2:      $(document).ready(function () {
   3:              
   4:          $('#MainSearchBox').autocomplete({
   5:              source: '<%= Url.Action("autocomplete", "search") %>',
   6:              minLength: 1,
   7:              select: function (event, ui) {
   8:                  $("#MainSearchForm").submit();
   9:              }
  10:          });
  11:   
  12:          $("#MainSearchBox").keypress(function (event) {
  13:              if (event.keyCode == 13)
  14:                  $("#MainSearchForm").submit();
  15:          });
  16:   
  17:      });
  18:  </script>
  19:   
  20:  <h2>Suche</h2>
  21:   
  22:  <form action="<%= Url.Action("index", "search") %>" method="get" id="MainSearchForm">
  23:      <input type="text" id="MainSearchBox" name="q" value="<%: Model.Query %>" /> <input type="submit" value="Suche" />
  24:  </form>

 

Kommentare

  1. Michael Karl schrieb am Sonntag, 21. November 2010 11:26:00 Uhr:

    Vielen Dank für den Codeschnipsel.
    Funktioniert hervorragend. Weisst du ob das in UI 1.8.6 irgendwelche unpassenden Auswirkungen hat?

    Viele Grüße,
    Michael
  2. Thomas schrieb am Sonntag, 21. November 2010 14:01:00 Uhr:

    Ich hatte gelesen (finde es leider nicht mehr), dass das aktuelle Verhalten gewünscht war, dies aber geändert wird. Ob und inwiefern sich dann da was in die Quere kommt muss man abwarten bzw. ausprobieren.
  3. Michael Karl schrieb am Sonntag, 21. November 2010 19:28:00 Uhr:

    Ok, dann werde ich das spätestens bei der Umstellung auf die aktuelle jQuery-Version merken :)


« Zurück  |  Weiter »