diff --git a/packages/alpinejs/src/utils/on.js b/packages/alpinejs/src/utils/on.js index 6827cedfd..af6df6f9f 100644 --- a/packages/alpinejs/src/utils/on.js +++ b/packages/alpinejs/src/utils/on.js @@ -37,7 +37,14 @@ export default function on (el, event, modifiers, callback) { if (modifiers.includes('prevent')) handler = wrapHandler(handler, (next, e) => { e.preventDefault(); next(e) }) if (modifiers.includes('stop')) handler = wrapHandler(handler, (next, e) => { e.stopPropagation(); next(e) }) - if (modifiers.includes('self')) handler = wrapHandler(handler, (next, e) => { e.target === el && next(e) }) + + if (modifiers.includes("once")) { + handler = wrapHandler(handler, (next, e) => { + next(e); + + listenerTarget.removeEventListener(event, handler, options); + }); + } if (modifiers.includes('away') || modifiers.includes('outside')) { listenerTarget = document @@ -57,13 +64,7 @@ export default function on (el, event, modifiers, callback) { }) } - if (modifiers.includes('once')) { - handler = wrapHandler(handler, (next, e) => { - next(e) - - listenerTarget.removeEventListener(event, handler, options) - }) - } + if (modifiers.includes('self')) handler = wrapHandler(handler, (next, e) => { e.target === el && next(e) }) // Handle :keydown and :keyup listeners. handler = wrapHandler(handler, (next, e) => { diff --git a/tests/cypress/integration/directives/x-on.spec.js b/tests/cypress/integration/directives/x-on.spec.js index aac85a25e..2704000d3 100644 --- a/tests/cypress/integration/directives/x-on.spec.js +++ b/tests/cypress/integration/directives/x-on.spec.js @@ -186,6 +186,27 @@ test('.self modifier', } ) +test( + ".self.once modifiers", + html` +