]> source.dussan.org Git - jquery-ui.git/commitdiff
Autocomplete: Trigger search timeout on all input events. Fixes #6666 - keyboard... 275/head
authorTrey Hunner <treyhunner@gmail.com>
Wed, 11 May 2011 03:24:21 +0000 (20:24 -0700)
committerTrey Hunner <treyhunner@gmail.com>
Sun, 15 May 2011 19:50:26 +0000 (12:50 -0700)
The input event triggers after all changes to an input field including
paste/cut events.

ui/jquery.ui.autocomplete.js

index b3d7598c1fdfd4f7c2193f2947ef9ab7d5f36d7e..4be4774d9d1c18d635462fe8942184862756acee 100644 (file)
@@ -47,7 +47,8 @@ $.widget( "ui.autocomplete", {
        _create: function() {
                var self = this,
                        doc = this.element[ 0 ].ownerDocument,
-                       suppressKeyPress;
+                       suppressKeyPress,
+                       suppressInput;
 
                this.valueMethod = this.element[ this.element.is( "input" ) ? "val" : "text" ];
 
@@ -63,10 +64,12 @@ $.widget( "ui.autocomplete", {
                        .bind( "keydown.autocomplete", function( event ) {
                                if ( self.options.disabled || self.element.attr( "readonly" ) ) {
                     suppressKeyPress = true;
+                                       suppressInput = true;
                                        return;
                                }
 
                                suppressKeyPress = false;
+                               suppressInput = false;
                                var keyCode = $.ui.keyCode;
                                switch( event.keyCode ) {
                                case keyCode.PAGE_UP:
@@ -110,15 +113,8 @@ $.widget( "ui.autocomplete", {
                                        self.close( event );
                                        break;
                                default:
-                                       // keypress is triggered before the input value is changed
-                                       clearTimeout( self.searching );
-                                       self.searching = setTimeout(function() {
-                                               // only search if the value has changed
-                                               if ( self.term != self._value() ) {
-                                                       self.selectedItem = null;
-                                                       self.search( null, event );
-                                               }
-                                       }, self.options.delay );
+                                       // search timeout should be triggered before the input value is changed
+                                       self._searchTimeout( event );
                                        break;
                                }
                        })
@@ -150,6 +146,14 @@ $.widget( "ui.autocomplete", {
                                        break;
                 }
                        })
+                       .bind( "input.autocomplete", function(event) {
+                               if ( suppressInput ) {
+                                       suppressInput = false;
+                                       event.preventDefault();
+                                       return;
+                               }
+                               self._searchTimeout( event );
+                       })
                        .bind( "focus.autocomplete", function() {
                                if ( self.options.disabled ) {
                                        return;
@@ -317,6 +321,17 @@ $.widget( "ui.autocomplete", {
                }
        },
 
+       _searchTimeout: function( event ) {
+               var self = this;
+               self.searching = setTimeout(function() {
+                       // only search if the value has changed
+                       if ( self.term != self.element.val() ) {
+                               self.selectedItem = null;
+                               self.search( null, event );
+                       }
+               }, self.options.delay );
+       },
+
        search: function( value, event ) {
                value = value != null ? value : this._value();