71 lines
2.0 KiB
JavaScript
71 lines
2.0 KiB
JavaScript
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);
|