Skip to content

Commit adb3557

Browse files
committed
Autocomplete: Trigger search timeout on all input events. Fixes #6666 - keyboard-autorepeat on Firefox and paste event
The input event triggers after all changes to an input field including paste/cut events.
1 parent 85ac420 commit adb3557

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

ui/jquery.ui.autocomplete.js

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ $.widget( "ui.autocomplete", {
4747
_create: function() {
4848
var self = this,
4949
doc = this.element[ 0 ].ownerDocument,
50-
suppressKeyPress;
50+
suppressKeyPress,
51+
suppressInput;
5152

5253
this.valueMethod = this.element[ this.element.is( "input" ) ? "val" : "text" ];
5354

@@ -63,10 +64,12 @@ $.widget( "ui.autocomplete", {
6364
.bind( "keydown.autocomplete", function( event ) {
6465
if ( self.options.disabled || self.element.attr( "readonly" ) ) {
6566
suppressKeyPress = true;
67+
suppressInput = true;
6668
return;
6769
}
6870

6971
suppressKeyPress = false;
72+
suppressInput = false;
7073
var keyCode = $.ui.keyCode;
7174
switch( event.keyCode ) {
7275
case keyCode.PAGE_UP:
@@ -110,15 +113,8 @@ $.widget( "ui.autocomplete", {
110113
self.close( event );
111114
break;
112115
default:
113-
// keypress is triggered before the input value is changed
114-
clearTimeout( self.searching );
115-
self.searching = setTimeout(function() {
116-
// only search if the value has changed
117-
if ( self.term != self._value() ) {
118-
self.selectedItem = null;
119-
self.search( null, event );
120-
}
121-
}, self.options.delay );
116+
// search timeout should be triggered before the input value is changed
117+
self._searchTimeout( event );
122118
break;
123119
}
124120
})
@@ -150,6 +146,14 @@ $.widget( "ui.autocomplete", {
150146
break;
151147
}
152148
})
149+
.bind( "input.autocomplete", function(event) {
150+
if ( suppressInput ) {
151+
suppressInput = false;
152+
event.preventDefault();
153+
return;
154+
}
155+
self._searchTimeout( event );
156+
})
153157
.bind( "focus.autocomplete", function() {
154158
if ( self.options.disabled ) {
155159
return;
@@ -317,6 +321,17 @@ $.widget( "ui.autocomplete", {
317321
}
318322
},
319323

324+
_searchTimeout: function( event ) {
325+
var self = this;
326+
self.searching = setTimeout(function() {
327+
// only search if the value has changed
328+
if ( self.term != self.element.val() ) {
329+
self.selectedItem = null;
330+
self.search( null, event );
331+
}
332+
}, self.options.delay );
333+
},
334+
320335
search: function( value, event ) {
321336
value = value != null ? value : this._value();
322337

0 commit comments

Comments
 (0)