mirror of
https://github.com/fastmail/Squire.git
synced 2024-12-31 11:54:03 -05:00
Restore selection on focus, unless explicit click
This commit is contained in:
parent
3ff9a46ea9
commit
bac7c5d2cc
3 changed files with 54 additions and 2 deletions
|
@ -2288,6 +2288,17 @@ function Squire ( root, config ) {
|
||||||
this.addEventListener( 'keyup', this._keyUpDetectChange );
|
this.addEventListener( 'keyup', this._keyUpDetectChange );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On blur, restore focus except if there is any change to the content, or
|
||||||
|
// the user taps or clicks to focus a specific point. Can't actually use
|
||||||
|
// click event because focus happens before click, so use
|
||||||
|
// mousedown/touchstart
|
||||||
|
this._restoreSelection = false;
|
||||||
|
this.addEventListener( 'blur', enableRestoreSelection );
|
||||||
|
this.addEventListener( 'input', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'mousedown', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'touchstart', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'focus', restoreSelection );
|
||||||
|
|
||||||
// IE sometimes fires the beforepaste event twice; make sure it is not run
|
// IE sometimes fires the beforepaste event twice; make sure it is not run
|
||||||
// again before our after paste function is called.
|
// again before our after paste function is called.
|
||||||
this._awaitingPaste = false;
|
this._awaitingPaste = false;
|
||||||
|
@ -2555,6 +2566,9 @@ var getWindowSelection = function ( self ) {
|
||||||
|
|
||||||
proto.setSelection = function ( range ) {
|
proto.setSelection = function ( range ) {
|
||||||
if ( range ) {
|
if ( range ) {
|
||||||
|
// If we're setting selection, that automatically, and synchronously, // triggers a focus event. Don't want a reentrant call to setSelection.
|
||||||
|
this._restoreSelection = false;
|
||||||
|
this._lastSelection = range;
|
||||||
// iOS bug: if you don't focus the iframe before setting the
|
// iOS bug: if you don't focus the iframe before setting the
|
||||||
// selection, you can end up in a state where you type but the input
|
// selection, you can end up in a state where you type but the input
|
||||||
// doesn't get directed into the contenteditable area but is instead
|
// doesn't get directed into the contenteditable area but is instead
|
||||||
|
@ -2599,6 +2613,18 @@ proto.getSelection = function () {
|
||||||
return selection;
|
return selection;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function enableRestoreSelection () {
|
||||||
|
this._restoreSelection = true;
|
||||||
|
}
|
||||||
|
function disableRestoreSelection () {
|
||||||
|
this._restoreSelection = false;
|
||||||
|
}
|
||||||
|
function restoreSelection () {
|
||||||
|
if ( this._restoreSelection ) {
|
||||||
|
this.setSelection( this._lastSelection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
proto.getSelectedText = function () {
|
proto.getSelectedText = function () {
|
||||||
var range = this.getSelection(),
|
var range = this.getSelection(),
|
||||||
walker = new TreeWalker(
|
walker = new TreeWalker(
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -78,6 +78,17 @@ function Squire ( root, config ) {
|
||||||
this.addEventListener( 'keyup', this._keyUpDetectChange );
|
this.addEventListener( 'keyup', this._keyUpDetectChange );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On blur, restore focus except if there is any change to the content, or
|
||||||
|
// the user taps or clicks to focus a specific point. Can't actually use
|
||||||
|
// click event because focus happens before click, so use
|
||||||
|
// mousedown/touchstart
|
||||||
|
this._restoreSelection = false;
|
||||||
|
this.addEventListener( 'blur', enableRestoreSelection );
|
||||||
|
this.addEventListener( 'input', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'mousedown', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'touchstart', disableRestoreSelection );
|
||||||
|
this.addEventListener( 'focus', restoreSelection );
|
||||||
|
|
||||||
// IE sometimes fires the beforepaste event twice; make sure it is not run
|
// IE sometimes fires the beforepaste event twice; make sure it is not run
|
||||||
// again before our after paste function is called.
|
// again before our after paste function is called.
|
||||||
this._awaitingPaste = false;
|
this._awaitingPaste = false;
|
||||||
|
@ -345,6 +356,9 @@ var getWindowSelection = function ( self ) {
|
||||||
|
|
||||||
proto.setSelection = function ( range ) {
|
proto.setSelection = function ( range ) {
|
||||||
if ( range ) {
|
if ( range ) {
|
||||||
|
// If we're setting selection, that automatically, and synchronously, // triggers a focus event. Don't want a reentrant call to setSelection.
|
||||||
|
this._restoreSelection = false;
|
||||||
|
this._lastSelection = range;
|
||||||
// iOS bug: if you don't focus the iframe before setting the
|
// iOS bug: if you don't focus the iframe before setting the
|
||||||
// selection, you can end up in a state where you type but the input
|
// selection, you can end up in a state where you type but the input
|
||||||
// doesn't get directed into the contenteditable area but is instead
|
// doesn't get directed into the contenteditable area but is instead
|
||||||
|
@ -389,6 +403,18 @@ proto.getSelection = function () {
|
||||||
return selection;
|
return selection;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function enableRestoreSelection () {
|
||||||
|
this._restoreSelection = true;
|
||||||
|
}
|
||||||
|
function disableRestoreSelection () {
|
||||||
|
this._restoreSelection = false;
|
||||||
|
}
|
||||||
|
function restoreSelection () {
|
||||||
|
if ( this._restoreSelection ) {
|
||||||
|
this.setSelection( this._lastSelection );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
proto.getSelectedText = function () {
|
proto.getSelectedText = function () {
|
||||||
var range = this.getSelection(),
|
var range = this.getSelection(),
|
||||||
walker = new TreeWalker(
|
walker = new TreeWalker(
|
||||||
|
|
Loading…
Reference in a new issue