diff options
author | Felix Nagel <info@felixnagel.com> | 2015-12-02 18:20:54 +0100 |
---|---|---|
committer | Felix Nagel <info@felixnagel.com> | 2015-12-02 18:30:05 +0100 |
commit | c10ef0a170218ae64abaee54518b09068eadb51e (patch) | |
tree | 8ff6c9cb8e0f4a8846a3b272a26e65fef946ae3c /ui/widgets/autocomplete.js | |
parent | 7ed45541096b58c56c4fc40b1a0ca9c10b2fe229 (diff) | |
parent | 6c738d961d9918f75a3043a49ab21ac79bca45ae (diff) | |
download | jquery-ui-c10ef0a170218ae64abaee54518b09068eadb51e.tar.gz jquery-ui-c10ef0a170218ae64abaee54518b09068eadb51e.zip |
Merge branch 'master' into datepicker
Diffstat (limited to 'ui/widgets/autocomplete.js')
-rw-r--r-- | ui/widgets/autocomplete.js | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/ui/widgets/autocomplete.js b/ui/widgets/autocomplete.js index 4067f871f..060d8e94f 100644 --- a/ui/widgets/autocomplete.js +++ b/ui/widgets/autocomplete.js @@ -12,9 +12,9 @@ //>>description: Lists suggested words as the user is typing. //>>docs: http://api.jqueryui.com/autocomplete/ //>>demos: http://jqueryui.com/autocomplete/ -//>>css.structure: ../themes/base/core.css -//>>css.structure: ../themes/base/autocomplete.css -//>>css.theme: ../themes/base/theme.css +//>>css.structure: ../../themes/base/core.css +//>>css.structure: ../../themes/base/autocomplete.css +//>>css.theme: ../../themes/base/theme.css ( function( factory ) { if ( typeof define === "function" && define.amd ) { @@ -245,24 +245,6 @@ $.widget( "ui.autocomplete", { this.element.trigger( "focus" ); } } ); - - // Clicking on the scrollbar causes focus to shift to the body - // but we can't detect a mouseup or a click immediately afterward - // so we have to track the next mousedown and close the menu if - // the user clicks somewhere outside of the autocomplete - var menuElement = this.menu.element[ 0 ]; - if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { - this._delay( function() { - var that = this; - this.document.one( "mousedown", function( event ) { - if ( event.target !== that.element[ 0 ] && - event.target !== menuElement && - !$.contains( menuElement, event.target ) ) { - that.close(); - } - } ); - } ); - } }, menufocus: function( event, ui ) { var label, item; @@ -368,6 +350,20 @@ $.widget( "ui.autocomplete", { } }, + _isEventTargetInWidget: function( event ) { + var menuElement = this.menu.element[ 0 ]; + + return event.target === this.element[ 0 ] || + event.target === menuElement || + $.contains( menuElement, event.target ); + }, + + _closeOnClickOutside: function( event ) { + if ( !this._isEventTargetInWidget( event ) ) { + this.close(); + } + }, + _appendTo: function() { var element = this.options.appendTo; @@ -496,6 +492,10 @@ $.widget( "ui.autocomplete", { }, _close: function( event ) { + + // Remove the handler that closes the menu on outside clicks + this._off( this.document, "mousedown" ); + if ( this.menu.element.is( ":visible" ) ) { this.menu.element.hide(); this.menu.blur(); @@ -546,6 +546,11 @@ $.widget( "ui.autocomplete", { if ( this.options.autoFocus ) { this.menu.next(); } + + // Listen for interactions outside of the widget (#6642) + this._on( this.document, { + mousedown: "_closeOnClickOutside" + } ); }, _resizeMenu: function() { |