Selectmenu: Preserve text selection and button focus on click

Fixes #10639
Closes gh-1358
This commit is contained in:
Scott González 2014-10-09 10:25:26 -04:00
parent 73cdc09e9a
commit d4a437e4b0

View File

@ -144,6 +144,12 @@ return $.widget( "ui.selectmenu", {
role: "listbox", role: "listbox",
select: function( event, ui ) { select: function( event, ui ) {
event.preventDefault(); 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 ); that._select( ui.item.data( "ui-selectmenu-item" ), event );
}, },
focus: function( event, ui ) { focus: function( event, ui ) {
@ -254,6 +260,7 @@ return $.widget( "ui.selectmenu", {
this.isOpen = false; this.isOpen = false;
this._toggleAttr(); this._toggleAttr();
this.range = null;
this._off( this.document ); this._off( this.document );
this._trigger( "close", event ); this._trigger( "close", event );
@ -342,6 +349,29 @@ return $.widget( "ui.selectmenu", {
this[ this.isOpen ? "close" : "open" ]( event ); 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: { _documentClick: {
mousedown: function( event ) { mousedown: function( event ) {
if ( !this.isOpen ) { if ( !this.isOpen ) {
@ -357,11 +387,25 @@ return $.widget( "ui.selectmenu", {
_buttonEvents: { _buttonEvents: {
// Prevent text selection from being reset when interacting with the selectmenu (#10144) // Prevent text selection from being reset when interacting with the selectmenu (#10144)
mousedown: function( event ) { mousedown: function() {
event.preventDefault(); 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 ) { keydown: function( event ) {
var preventDefault = true; var preventDefault = true;