diff options
author | Scott González <scott.gonzalez@gmail.com> | 2014-10-09 10:25:26 -0400 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2014-10-16 08:13:53 -0400 |
commit | d4a437e4b0d91d40eff269a19672a6db9217766e (patch) | |
tree | 311315663bed1c314a9921442c30728f9d052b82 | |
parent | 73cdc09e9a8939db5f097a4ba9b164484c81b443 (diff) | |
download | jquery-ui-d4a437e4b0d91d40eff269a19672a6db9217766e.tar.gz jquery-ui-d4a437e4b0d91d40eff269a19672a6db9217766e.zip |
Selectmenu: Preserve text selection and button focus on click
Fixes #10639
Closes gh-1358
-rw-r--r-- | ui/selectmenu.js | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/ui/selectmenu.js b/ui/selectmenu.js index a3d4281a6..26456b0dc 100644 --- a/ui/selectmenu.js +++ b/ui/selectmenu.js @@ -144,6 +144,12 @@ return $.widget( "ui.selectmenu", { role: "listbox", select: function( event, ui ) { event.preventDefault(); + + // support: IE8 + // If the item was selected via a click, the text selection + // will be destroyed in IE + that._setSelection(); + that._select( ui.item.data( "ui-selectmenu-item" ), event ); }, focus: function( event, ui ) { @@ -254,6 +260,7 @@ return $.widget( "ui.selectmenu", { this.isOpen = false; this._toggleAttr(); + this.range = null; this._off( this.document ); this._trigger( "close", event ); @@ -342,6 +349,29 @@ return $.widget( "ui.selectmenu", { this[ this.isOpen ? "close" : "open" ]( event ); }, + _setSelection: function() { + var selection; + + if ( !this.range ) { + return; + } + + if ( window.getSelection ) { + selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange( this.range ); + + // support: IE8 + } else { + this.range.select(); + } + + // support: IE + // Setting the text selection kills the button focus in IE, but + // restoring the focus doesn't kill the selection. + this.button.focus(); + }, + _documentClick: { mousedown: function( event ) { if ( !this.isOpen ) { @@ -357,11 +387,25 @@ return $.widget( "ui.selectmenu", { _buttonEvents: { // Prevent text selection from being reset when interacting with the selectmenu (#10144) - mousedown: function( event ) { - event.preventDefault(); + mousedown: function() { + var selection; + + if ( window.getSelection ) { + selection = window.getSelection(); + if ( selection.rangeCount ) { + this.range = selection.getRangeAt( 0 ); + } + + // support: IE8 + } else { + this.range = document.selection.createRange(); + } }, - click: "_toggle", + click: function( event ) { + this._setSelection(); + this._toggle( event ); + }, keydown: function( event ) { var preventDefault = true; |