diff --git a/tests/unit/autocomplete/autocomplete_core.js b/tests/unit/autocomplete/autocomplete_core.js index b6dd139e06f..679955d1971 100644 --- a/tests/unit/autocomplete/autocomplete_core.js +++ b/tests/unit/autocomplete/autocomplete_core.js @@ -192,6 +192,34 @@ asyncTest( "handle race condition", function() { } }); +asyncTest( "simultaneous searches (#9334)", function() { + expect( 2 ); + var element = $( "#autocomplete" ).autocomplete({ + source: function( request, response ) { + setTimeout(function() { + response([ request.term ]); + }); + }, + response: function() { + ok( true, "response from first instance" ); + } + }), + element2 = $( "#autocomplete-textarea" ).autocomplete({ + source: function( request, response ) { + setTimeout(function() { + response([ request.term ]); + }); + }, + response: function() { + ok( true, "response from second instance" ); + start(); + } + }); + + element.autocomplete( "search", "test" ); + element2.autocomplete( "search", "test" ); +}); + test( "ARIA", function() { expect( 7 ); var element = $( "#autocomplete" ).autocomplete({ diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 5dea7128783..1f318078fcd 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -41,6 +41,7 @@ $.widget( "ui.autocomplete", { select: null }, + requestIndex: 0, pending: 0, _create: function() { @@ -415,24 +416,20 @@ $.widget( "ui.autocomplete", { this.source( { term: value }, this._response() ); }, - _response: (function() { - var requestIndex = 0; + _response: function() { + var index = ++this.requestIndex; - return function() { - var index = ++requestIndex; - - return $.proxy(function( content ) { - if ( index === requestIndex ) { - this.__response( content ); - } + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); + } - this.pending--; - if ( !this.pending ) { - this.element.removeClass( "ui-autocomplete-loading" ); - } - }, this ); - }; - })(), + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, this ); + }, __response: function( content ) { if ( content ) {