Javascript 中的 preventDefault 停止发送电子邮件

Posted

技术标签:

【中文标题】Javascript 中的 preventDefault 停止发送电子邮件【英文标题】:preventDefault in Javascript stops sending email 【发布时间】:2021-07-25 04:32:46 【问题描述】:

我想寻求一点帮助。我在 jQuery 中看到了一些东西,但我需要 javascript。为了我们的目的,我创建了简单的表格。使用 preventDefault 我没有收到任何邮件,当我删除 preventDefault 时,我收到的邮件包含表单中的所有数据,但没有验证过程,但验证功能仍然存在。谢谢你的帮助。

const form = document.querySelector("form");
const nameInput = document.querySelector("input[name='username']");
const emailInput = document.querySelector("input[name='email']");
const subjectInput = document.querySelector("input[name='subject']");
const messageInput = document.querySelector("textarea[name='message']");

form.addEventListener("submit", (e) => 
    checkInputs();
    e.preventDefault();
);

const checkInputs = () => 
    if(!nameInput.value) 
        showError(nameInput, "Field cannot be blank!");
    


const showError = (input, message) => 
    const formControl = input.parentElement;
    const errorMsg = formControl.querySelector("p");
    formControl.classList.add("error");
    errorMsg.innerText = message;

【问题讨论】:

【参考方案1】:

只有在没有错误的情况下,您才能以编程方式提交表单。

form.addEventListener("submit", (e) => 
    e.preventDefault();

    const hasError = checkInputs();

    if (!hasError) 
        form.submit();
    
);

const checkInputs = () => 
    let hasError = false;

    if(!nameInput.value) 
        hasError = true;
        showError(nameInput, "Field cannot be blank!");
    

    return hasError;

【讨论】:

【参考方案2】:

Martin,来自 MDN 页面:

Event 接口的 preventDefault() 方法告诉用户代理,如果事件没有得到显式处理,则不应像往常一样采取其默认操作。

如果您将事件放在按钮(默认类型提交)、提交类型的输入或表单上,它将发送电子邮件,这是默认操作。它不会验证任何内容,只需发送电子邮件即可。

您应该阻止默认该事件,验证您想要的所有内容,并使用 fetch 到 php 脚本 或任何其他有效方法发送电子邮件。 另一个缺点是如果你不阻止默认,它会刷新浏览器...

让我知道这是否有意义。

【讨论】:

【参考方案3】:

在您的情况下,e.preventDefault() 阻止您的提交处理程序的默认事件,这是提交表单。因此,在您的情况下,您始终会阻止提交表单,因为这与您的验证功能无关。但是您可以将事件对象传递给您的验证函数,并且仅在您的表单未通过验证时才阻止默认值,例如:

form.addEventListener("submit", (e) => 
    checkInputs(e);
);

const checkInputs = (e) => 
    if(!nameInput.value) 
        showError(nameInput, "Field cannot be blank!");
        e.preventDefault();
    

然后,我还会合并提交处理程序和 checkInputs 函数,你会得到什么:

form.addEventListener("submit", (e) => 
    if(!nameInput.value) 
        showError(nameInput, "Field cannot be blank!");
        e.preventDefault();
    
)

【讨论】:

非常感谢 Johannes,现在可以了 :) 不客气,请随时接受此答案,因为它有助于其他 SO 成员对已回答和未回答的问题进行排序。

以上是关于Javascript 中的 preventDefault 停止发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

下一个 上一个 Bootstrap 选项卡

将表格单元格添加到现有表格行,jQuery

iOS Web CSS/HTML最小值

更改活动导航项的颜色并显示相对于导航栏项的页面

Node中的JavaScript和浏览器中的JavaScript的区别

JavaScript中的对象