Search and Top Navigation
#12554 closed bug (duplicate)
Opened May 12, 2015 05:50AM UTC
Closed May 12, 2015 11:41AM UTC
The return value of prop("checked") can become different from what we expect by looking.
Reported by: | naozo.yoshioka | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | none |
Component: | ui.button | Version: | 1.11.4 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
How to reproduce the problem
After pressing the mouse on a radio button, then slightly move and release, the return value of prop("checked") becomes different from what we expect by looking.
Here is the HTML to reproduce it.
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery UI Button - Radios</title> <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script> <link rel="stylesheet" href="https://jqueryui.com/resources/demos/style.css"> <script> $(function() { $( "#radio" ).buttonset(); $( "#list" ).click(function() { $( "body" ).append("Choice 1: " + $( "#radio1" ).prop("checked") + ", Choice 2: " + $( "#radio2" ).prop("checked") + ", Choice 3: " + $( "#radio3" ).prop("checked") + "<br/>"); }); }); </script> </head> <body> <form> <div id="radio"> <input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label> <input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label> <input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label> </div> <button type="button" id="list">List</button><br/> </form> </body> </html>
After the HTML shows, click "List" button.
"Choice 1: false, Choice 2: true, Choice 3: false" is displayed.
And press a mouse on "Choice 1" then move slightly and release then click "List" button again.
Still "Choice 1: false, Choice 2: true, Choice 3: false" is displayed though "Choice 1" looks selected.
The expected behavior is that "Choice 2" looks selected because prop("checked") of "Choice 2" return true.
I checked the behavior of jQuery UI 1.11.4 on Chrome 42.0.2311.135 m and Firefox 37.0.2 on Windows 7 Professional.
jQuery UI 1.10.4 also has the same problem.
Why it happens
click event handler for radio in jQuery UI Button is below.
this.buttonElement.bind( "click" + this.eventNamespace, function() { if ( options.disabled ) { return false; } $( this ).addClass( "ui-state-active" ); that.buttonElement.attr( "aria-pressed", "true" ); var radio = that.element[ 0 ]; radioGroup( radio ) .not( radio ) .map(function() { return $( this ).button( "widget" )[ 0 ]; }) .removeClass( "ui-state-active" ) .attr( "aria-pressed", "false" ); });
change event handler for radio in jQuery UI Button is below.
this.element.bind( "change" + this.eventNamespace, function() { that.refresh(); });
The part for radio in refresh in jQuery UI Button is below.
radioGroup( this.element[0] ).each(function() { if ( $( this ).is( ":checked" ) ) { $( this ).button( "widget" ) .addClass( "ui-state-active" ) .attr( "aria-pressed", "true" ); } else { $( this ).button( "widget" ) .removeClass( "ui-state-active" ) .attr( "aria-pressed", "false" ); } });
If we click normally, the return values of prop("checked") change.
And click event is raised then change event is raised.
So there is no problem.
But if we press a mouse then move slightly and release, the return values of prop("checked") don't change.
And only click event is raised.
But click event handler adds the class "ui-state-active" to the clicked button and removes the class from to the other buttons.
How to fix
I think the class "ui-state-active" should be controlled only when change event is raised.
So I think the below code is enough as the click event handler .
this.buttonElement.bind( "click" + this.eventNamespace, function() { if ( options.disabled ) { return false; } });
Attachments (0)
Change History (1)
Changed May 12, 2015 11:41AM UTC by comment:1
resolution: | → duplicate |
---|---|
status: | new → closed |
Duplicate of #9990.