Skip to content

Commit 0d0b05e

Browse files
committed
Button: Remove ui-state-focus class when becoming disabled. Fixes #9169 - Button: Disabled button maintains ui-state-focus in IE & Firefox on Windows.
1 parent 2de31fd commit 0d0b05e

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

tests/unit/button/button.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ <h2 id="qunit-userAgent"></h2>
7171

7272
<div><input id="submit" type="submit" value="Label"></div>
7373

74+
<button id="button1">Button</button>
75+
7476
</div>
7577
</body>
7678
</html>

tests/unit/button/button_core.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,17 @@ test( "#7534 - Button label selector works for ids with \":\"", function() {
196196
ok( group.find( "label" ).is( ".ui-button" ), "Found an id with a :" );
197197
});
198198

199+
asyncTest( "#9169 - Disabled button maintains ui-state-focus", function() {
200+
expect( 2 );
201+
var element = $( "#button1" ).button();
202+
element[ 0 ].focus();
203+
setTimeout(function() {
204+
ok( element.hasClass( "ui-state-focus" ), "button has ui-state-focus" );
205+
element.button( "disable" );
206+
ok( !element.hasClass( "ui-state-focus" ),
207+
"button does not have ui-state-focus when disabled" );
208+
start();
209+
});
210+
});
211+
199212
})(jQuery);

ui/jquery.ui.button.js

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
var lastActive, startXPos, startYPos, clickDragged,
1818
baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
19-
stateClasses = "ui-state-hover ui-state-active ",
2019
typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
2120
formResetHandler = function() {
2221
var form = $( this );
@@ -71,8 +70,7 @@ $.widget( "ui.button", {
7170
var that = this,
7271
options = this.options,
7372
toggleButton = this.type === "checkbox" || this.type === "radio",
74-
activeClass = !toggleButton ? "ui-state-active" : "",
75-
focusClass = "ui-state-focus";
73+
activeClass = !toggleButton ? "ui-state-active" : "";
7674

7775
if ( options.label === null ) {
7876
options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
@@ -104,14 +102,16 @@ $.widget( "ui.button", {
104102
}
105103
});
106104

107-
this.element
108-
.bind( "focus" + this.eventNamespace, function() {
109-
// no need to check disabled, focus won't be triggered anyway
110-
that.buttonElement.addClass( focusClass );
111-
})
112-
.bind( "blur" + this.eventNamespace, function() {
113-
that.buttonElement.removeClass( focusClass );
114-
});
105+
// Can't use _focusable() because the element that receives focus
106+
// and the element that gets the ui-state-focus class are different
107+
this._on({
108+
focus: function() {
109+
this.buttonElement.addClass( "ui-state-focus" );
110+
},
111+
blur: function() {
112+
this.buttonElement.removeClass( "ui-state-focus" );
113+
}
114+
});
115115

116116
if ( toggleButton ) {
117117
this.element.bind( "change" + this.eventNamespace, function() {
@@ -257,7 +257,7 @@ $.widget( "ui.button", {
257257
this.element
258258
.removeClass( "ui-helper-hidden-accessible" );
259259
this.buttonElement
260-
.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
260+
.removeClass( baseClasses + " ui-state-active " + typeClasses )
261261
.removeAttr( "role" )
262262
.removeAttr( "aria-pressed" )
263263
.html( this.buttonElement.find(".ui-button-text").html() );
@@ -272,6 +272,9 @@ $.widget( "ui.button", {
272272
if ( key === "disabled" ) {
273273
this.widget().toggleClass( "ui-state-disabled", !!value );
274274
this.element.prop( "disabled", !!value );
275+
if ( value ) {
276+
this.buttonElement.removeClass( "ui-state-focus" );
277+
}
275278
return;
276279
}
277280
this._resetButton();

0 commit comments

Comments
 (0)