if ( options.wasCollapsed !== undefined ) {
wasCollapsed = options.wasCollapsed;
} else {
+ // eslint-disable-next-line no-jquery/no-class-state
wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
}
.toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
}
+ // Toggle `aria-expanded` attribute, if requested (for default and premade togglers by default).
+ if ( options.toggleARIA ) {
+ $toggle.attr( 'aria-expanded', wasCollapsed ? 'true' : 'false' );
+ }
+
// Toggle the text ("Show"/"Hide") within elements tagged with mw-collapsible-text
if ( options.toggleText ) {
collapseText = options.toggleText.collapseText;
actionHandler = function ( e, opts ) {
var defaultOpts = {
toggleClasses: true,
+ toggleARIA: true,
toggleText: { collapseText: collapseText, expandText: expandText }
};
opts = $.extend( defaultOpts, options, opts );
}
} else {
// The toggle-link will be in one of the cells (td or th) of the first row
- $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
+ $firstItem = $collapsible.find( 'tr' ).first().find( 'th, td' );
$toggle = $firstItem.find( '> .mw-collapsible-toggle' );
// If theres no toggle link, add it to the last cell
$collapsible.before( $toggle );
} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
// The toggle-link will be in the first list-item
- $firstItem = $collapsible.find( 'li:first' );
+ $firstItem = $collapsible.find( 'li' ).first();
$toggle = $firstItem.find( '> .mw-collapsible-toggle' );
// If theres no toggle link, add it
// Attach event handlers to togglelink
$toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+ .attr( 'aria-expanded', 'true' )
.prop( 'tabIndex', 0 );
$( this ).data( 'mw-collapsible', {
} );
// Initial state
+ // eslint-disable-next-line no-jquery/no-class-state
if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
// One toggler can hook to multiple elements, and one element can have
// multiple togglers. This is the sanest way to handle that.