diff options
author | Scott González <scott.gonzalez@gmail.com> | 2012-05-10 17:59:55 -0400 |
---|---|---|
committer | Scott González <scott.gonzalez@gmail.com> | 2012-05-10 17:59:55 -0400 |
commit | d393c8b4cb26ec34878c22202da6ba9393e0094d (patch) | |
tree | d1aa311ebe221eef1af3ebeebd3c61dd646ba113 /ui/jquery.ui.spinner.js | |
parent | ab4d8b748d26df79f7e9cf32a5f80d07c05f790b (diff) | |
download | jquery-ui-d393c8b4cb26ec34878c22202da6ba9393e0094d.tar.gz jquery-ui-d393c8b4cb26ec34878c22202da6ba9393e0094d.zip |
Spinner: Handle async focus events in IE. Fixes incorrect detection of changes.
Diffstat (limited to 'ui/jquery.ui.spinner.js')
-rw-r--r-- | ui/jquery.ui.spinner.js | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/ui/jquery.ui.spinner.js b/ui/jquery.ui.spinner.js index bd55a09ea..1e4204a0c 100644 --- a/ui/jquery.ui.spinner.js +++ b/ui/jquery.ui.spinner.js @@ -93,6 +93,11 @@ $.widget( "ui.spinner", { this.previous = this.element.val(); }, blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + this._refresh(); this.uiSpinner.removeClass( "ui-state-active" ); if ( this.previous !== this.element.val() ) { @@ -117,11 +122,42 @@ $.widget( "ui.spinner", { event.preventDefault(); }, "mousedown .ui-spinner-button": function( event ) { + var previous; + + // We never want the buttons to have focus; whenever the user is + // interacting with the spinner, the focus should be on the input. + // If the input is focused then this.previous is properly set from + // when the input first received focus. If the input is not focused + // then we need to set this.previous based on the value before spinning. + previous = this.element[0] === this.document[0].activeElement ? + this.previous : this.element.val(); + function checkFocus() { + var isActive = this.element[0] === this.document[0].activeElement; + if ( !isActive ) { + this.element.focus(); + this.previous = previous; + // support: IE + // IE sets focus asynchronously, so we need to check if focus + // moved off of the input because the user clicked on the button. + this._delay(function() { + this.previous = previous; + }); + } + } + // ensure focus is on (or stays on) the text field event.preventDefault(); - if ( this.document[0].activeElement !== this.element[ 0 ] ) { - this.element.focus(); - } + checkFocus.call( this ); + + // support: IE + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + // and check (again) if focus moved off of the input. + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + checkFocus.call( this ); + }); if ( this._start( event ) === false ) { return; |