const CONFIRM_ATTR = 'data-confirm-message'; const isSubmitControl = (element) => { if (!(element instanceof HTMLElement)) { return false; } if (element instanceof HTMLButtonElement) { const type = String(element.getAttribute('type') || 'submit').trim().toLowerCase(); return type === '' || type === 'submit'; } if (element instanceof HTMLInputElement) { const type = String(element.type || '').trim().toLowerCase(); return type === 'submit' || type === 'image'; } return false; }; const submitterByForm = new Map(); const onClickCapture = (event) => { const trigger = event.target instanceof HTMLElement ? event.target.closest('a, button, input') : null; if (!(trigger instanceof HTMLElement)) { return; } if (isSubmitControl(trigger)) { const form = trigger.form instanceof HTMLFormElement ? trigger.form : null; if (form) { submitterByForm.set(form, trigger); } return; } const confirmMessage = String(trigger.getAttribute(CONFIRM_ATTR) || '').trim(); if (confirmMessage === '') { return; } if (!window.confirm(confirmMessage)) { event.preventDefault(); event.stopPropagation(); } }; const onSubmitCapture = (event) => { const form = event.target instanceof HTMLFormElement ? event.target : null; if (!(form instanceof HTMLFormElement)) { return; } const submitter = event.submitter instanceof HTMLElement ? event.submitter : (submitterByForm.get(form) || null); submitterByForm.delete(form); const submitterMessage = String(submitter?.getAttribute(CONFIRM_ATTR) || '').trim(); const formMessage = String(form.getAttribute(CONFIRM_ATTR) || '').trim(); const confirmMessage = submitterMessage !== '' ? submitterMessage : formMessage; if (confirmMessage === '') { return; } if (!window.confirm(confirmMessage)) { event.preventDefault(); event.stopPropagation(); } }; document.addEventListener('click', onClickCapture, true); document.addEventListener('submit', onSubmitCapture, true);