提交事件不会在 JavaScript 中执行所需的输出

如何解决提交事件不会在 JavaScript 中执行所需的输出

我正在为一个电子邮件应用程序设计一个前端,该应用程序通过 API 调用来发送和接收电子邮件。首先,我尝试通过向传入 recipientssubjectbody 的 /emails 路由发出 POST 请求来成功发送电子邮件 我从用户提交的表单中抓取。 用户提交表单后,我想加载 sent 邮箱视图。我的页面加载了发送的视图,但很快就会出现 compose view,我似乎无法弄清楚原因。

inBox.html

{% extends "mail/layout.html" %}
{% load static %}

{% block body %}
    <h2>{{ request.user.email }}</h2>

    <button class="btn btn-sm btn-outline-primary" id="inBox">InBox</button>
    <button class="btn btn-sm btn-outline-primary" id="compose">Compose</button>
    <button class="btn btn-sm btn-outline-primary" id="sent">Sent</button>
    <button class="btn btn-sm btn-outline-primary" id="archived">Archived</button>
    <a class="btn btn-sm btn-outline-primary" href="{% url 'logout' %}">Log Out</a>
    <hr>

    <div id="emails-view">
    </div>

    <div id="compose-view">
        <h3>New Email</h3>
        <form id="compose-form">
            <div class="form-group">
                From: <input disabled class="form-control" value="{{ request.user.email }}">
            </div>
            <div class="form-group">
                To: <input id="compose-recipients" class="form-control">
            </div>
            <div class="form-group">
                <input class="form-control" id="compose-subject" placeholder="Subject">
            </div>
            <textarea class="form-control" id="compose-body" placeholder="Body"></textarea>
            <input type="submit" class="btn btn-primary"/>
        </form>
    </div>
{% endblock %}

{% block script %}
    <script src="{% static 'mail/inBox.js' %}"></script>
{% endblock %}

inBox.js

document.addEventListener('DOMContentLoaded',function() {

  var form = document.querySelector('#compose-form');

  form.addEventListener('submit',function(e){

    // e.preventDefault();

    let sent = false;

    const recipients = document.querySelector('#compose-recipients').value;
    const subject = document.querySelector('#compose-subject').value;
    const body = document.querySelector('#compose-body').value;

    fetch('/emails',{
      method: 'POST',body: JSON.stringify({
          recipients: recipients,subject: subject,body: body
      })
    })
    .then(response => response.json())
    .then(result => {
        // Print result
        console.log(result);
        sent = true;
    });

    load_mailBox('sent');

    return false;

  })
  
  
  // Use buttons to toggle between views
  document.querySelector('#inBox').addEventListener('click',() => load_mailBox('inBox'));
  document.querySelector('#sent').addEventListener('click',() => load_mailBox('sent'));
  document.querySelector('#archived').addEventListener('click',() => load_mailBox('archive'));
  document.querySelector('#compose').addEventListener('click',compose_email);

  // By default,load the inBox
  if (sent === false) {
    load_mailBox('inBox');
  }
  // load_mailBox('inBox');
});

function compose_email() {

  // Show compose view and hide other views
  document.querySelector('#emails-view').style.display = 'none';
  document.querySelector('#compose-view').style.display = 'block';

  // Clear out composition fields
  document.querySelector('#compose-recipients').value = '';
  document.querySelector('#compose-subject').value = '';
  document.querySelector('#compose-body').value = '';
}

function load_mailBox(mailBox) {
  
  // Show the mailBox and hide other views
  document.querySelector('#emails-view').style.display = 'block';
  document.querySelector('#compose-view').style.display = 'none';

  // Show the mailBox name
  document.querySelector('#emails-view').innerHTML = `<h3>${mailBox.charat(0).toupperCase() + mailBox.slice(1)}</h3>`;
}

解决方法

我认为发生这种情况的原因是提交事件总是有一个重定向附加到表单的 action 属性中的 url。如果缺少 action 属性,则默认重定向将变为同一页面。

我建议您根本不要使用提交事件。由于您无论如何都要手动编译表单数据(对于 /email 请求),只需将提交按钮更改为普通的 <button> 标记,然后将您为提交所做的所有过程添加到一个简单的“点击”

代码看起来像这样(假设您的发送电子邮件按钮的 id 是 'send-email'

document.querySelector("#send-email").addEventListener('click',function(){

let sent = false;

const recipients = document.querySelector('#compose-recipients').value;
const subject = document.querySelector('#compose-subject').value;
const body = document.querySelector('#compose-body').value;

fetch('/emails',{
  method: 'POST',body: JSON.stringify({
      recipients: recipients,subject: subject,body: body
  })
})
.then(response => response.json())
.then(result => {
    // Print result
    console.log(result);
    sent = true;
});

load_mailbox('sent');

return false;

})

觉得有帮助就点个赞

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?