Button: find associated label even without common ancestor. Fixes #7092 - button creation that requires a matching label does not find label in all cases

(cherry picked from commit 0b30a1d450)
This commit is contained in:
ddstreet 2011-03-11 10:52:13 -05:00 committed by Scott González
parent c5b0a8660a
commit 2d6ad06873
2 changed files with 32 additions and 2 deletions

View File

@ -20,4 +20,26 @@ test( "#6262 - buttonset not applying ui-corner to invisible elements", function
ok( set.find( "label:eq(2)" ).is( ".ui-button.ui-corner-right" ) );
});
test( "#7092 - button creation that requires a matching label does not find label in all cases", function() {
var group = $( "<span><label for='t7092a'/><input type='checkbox' id='t7092a'/></span>" );
group.find( "input:checkbox" ).button();
ok( group.find( "label" ).is( ".ui-button" ) );
group = $( "<input type='checkbox' id='t7092b'/><label for='t7092b'/>" );
group.filter( "input:checkbox" ).button();
ok( group.filter( "label" ).is( ".ui-button" ) );
group = $( "<span><input type='checkbox' id='t7092c'/></span><label for='t7092c'/>" );
group.find( "input:checkbox" ).button();
ok( group.filter( "label" ).is( ".ui-button" ) );
group = $( "<span><input type='checkbox' id='t7092d'/></span><span><label for='t7092d'/></span>" );
group.find( "input:checkbox" ).button();
ok( group.find( "label" ).is( ".ui-button" ) );
group = $( "<input type='checkbox' id='t7092e'/><span><label for='t7092e'/></span>" );
group.filter( "input:checkbox" ).button();
ok( group.find( "label" ).is( ".ui-button" ) );
});
})( jQuery );

View File

@ -200,8 +200,16 @@ $.widget( "ui.button", {
if ( this.type === "checkbox" || this.type === "radio" ) {
// we don't search against the document in case the element
// is disconnected from the DOM
this.buttonElement = this.element.parents().last()
.find( "label[for=" + this.element.attr("id") + "]" );
var ancestor = this.element.parents().last(),
labelSelector = "label[for=" + this.element.attr("id") + "]";
this.buttonElement = ancestor.find( labelSelector );
if ( !this.buttonElement.length ) {
ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
this.buttonElement = ancestor.filter( labelSelector );
if ( !this.buttonElement.length ) {
this.buttonElement = ancestor.find( labelSelector );
}
}
this.element.addClass( "ui-helper-hidden-accessible" );
var checked = this.element.is( ":checked" );