diff --git a/js/src/button.js b/js/src/button.js
index a797f5050d40..9d63d2134f7c 100644
--- a/js/src/button.js
+++ b/js/src/button.js
@@ -27,6 +27,16 @@ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
*/
class Button extends BaseComponent {
+ constructor(element) {
+ super(element)
+
+ if (!this._element || this._element.hasAttribute('aria-pressed')) {
+ return
+ }
+
+ this._element.setAttribute('aria-pressed', this._element.classList.contains(CLASS_NAME_ACTIVE))
+ }
+
// Getters
static get NAME() {
return NAME
diff --git a/js/tests/unit/button.spec.js b/js/tests/unit/button.spec.js
index 6624fee7c98e..0e613feef4f2 100644
--- a/js/tests/unit/button.spec.js
+++ b/js/tests/unit/button.spec.js
@@ -22,6 +22,20 @@ describe('Button', () => {
expect(buttonByElement._element).toEqual(buttonEl)
})
+ it('should initialize aria-pressed when missing', () => {
+ fixtureEl.innerHTML = [
+ '',
+ ''
+ ].join('')
+
+ const buttons = fixtureEl.querySelectorAll('[data-bs-toggle="button"]')
+ const buttonInstances = [...buttons].map(button => new Button(button))
+
+ expect(buttonInstances).toHaveSize(2)
+ expect(buttons[0].getAttribute('aria-pressed')).toEqual('false')
+ expect(buttons[1].getAttribute('aria-pressed')).toEqual('true')
+ })
+
describe('VERSION', () => {
it('should return plugin version', () => {
expect(Button.VERSION).toEqual(jasmine.any(String))