Vanilla Javascript:待办事项列表在单击“提交”按钮后未创建,并且event.preventDefault不起作用

如何解决Vanilla Javascript:待办事项列表在单击“提交”按钮后未创建,并且event.preventDefault不起作用

我正在遵循使用Vanilla Javascript的Dev Ed的初学者工作清单指南。在YouTube评论中找不到我的问题的答案,所以我在这里问。

总而言之,我想要:

  1. 要获得看起来像第一张图片而不是第二张图片的结果,这就是我目前在Chrome,Firefox和Opera中打开的结果。

  2. 了解为什么event.preventDefault()无法正常工作以及为什么单击+按钮时页面仍保持刷新状态。

在他的https://github.com/developedbyed/vanilla-todo中,该代码在jsfiddle.com中可完美运行,但在Chrome,Firefox和Opera中,当我在Visual Studio Code>使用实时打开中打开代码时,结果似乎并不相同服务器。

What It Should Look Like

What It Looks Like For Me In Chrome,Firefox,and Opera

我从23:40开始被困在他的视频中-单击+按钮时,没有出现“嘿”行。 https://youtu.be/Ttf3CEsEwMQ?t=1420。当我单击+按钮时,页面将刷新。 event.preventDefault()似乎不起作用。

以下是这段视频中的代码:

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@100&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0- 
   2/css/all.min.css" integrity="sha256-46r060N2LrChLLb5zowXQ72/iKKNiw/lAmygmHExk/o=" 
crossorigin="anonymous" />
<link rel="stylesheet" href="./style.css">
<title>Todo List</title>
</head>
<body>
 
<header>
    <h1>My Todo List</h1> 
</header>
<form>
    <input type="text" class="todo-input"> 
    <button class="todo-button" type="submit">
     <i class="fas fa-plus-square"></i>   
    </button>
</form>
<div class="todo-container">
    <ul class="todo-list"></ul>
</div>
    <script scr="./app.js"></script>
</body>
</html>

JavaScript:

//Selectors
const todoInput = document.querySelector(".todo-input");
const todoButton= document.querySelector(".todo-button");
const todoList = document.querySelector(".todo-list");

//Event Listeners
todoButton.addEventListener("click",addTodo);
//Functions
event.preventDefault();
    //Prevent form from submitting
//Todo DIV
const todoDiv = document.createElement("div");
todoDiv.classList.add("todo");
//Create LI
const newTodo = document.createElement("li");
newTodo.innerText = "hey";
newTodo.classList.add("todo-item");
todoDiv.appendChild(newTodo);
//CHECK MARK BUTTON
const completedButton = document.createElement("button");
completedButton.innerHTML = '<i class="fas fa-check"></i>';
completedButton.classList.add("complete-btn");
todoDiv.appendChild(completedButton);
//CHECK trash BUTTON
const trashButton = document.createElement("button");
trashButton.innerHTML = '<i class="fas fa-trash"></i>';
trashButton.classList.add("trash-btn");
todoDiv.appendChild(trashButton);
//APPEND TO LIST
todoList.appendChild(todoDiv);
}

CSS:

    * { 
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body { 
    background-image: linear-gradient(120deg,#e2c35d,#d88771);
    color: white;
    font-family: 'Poppins',sans-serif;
    min-height: 100vh;
}
header {
    font-size: 1.5rem;

}

header,form {
    min-height: 20vh;
    display: flex; 
    justify-content: center;
    align-items: center;

}

form input,form button {
    padding: 0.5rem;
    font-size: 2 rem;
    border: none;
    background: white;
}

form button {
    color: #d88771;
    background: white;
    cursor: pointer;
    transition: all 0.3s ease;
}
form button:hover {
    background: white;
    color: #d88771;
    
}

解决方法

其中包含<button type="submit">的表单将在您单击该按钮时提交。这意味着您必须取消<form>而不是<button>的默认行为。我建议使用此方法,因为它使您可以控制表单的行为,而不仅仅是按钮的行为。它还允许您使用键盘上的 return 键提交表单。

在JavaScript中选择表单元素,如果必须使其更易于选择,请为其指定一个ID,然后在所选表单上监听submit事件。

现在,您要发生的是,每次单击提交按钮时都会调用addTodo函数。这就是addEventListener部分的目的。在这里,您可以监视事件,例如本例中的提交,并在发生任何事件时对其进行操作。因此,请监听表单上的Submit事件,并在触发该事件时调用addTodo

如果您在addEventListener函数中使用addTodo 内部,那么每次调用addTodo时都会添加一个新的侦听器,这很糟糕! / p>

查看下面的示例以了解其工作原理。

//Selectors - Also select the form.
const todoForm = document.querySelector("#todo-form");
const todoInput = document.querySelector(".todo-input");
const todoButton = document.querySelector(".todo-button");
const todoList = document.querySelector(".todo-list");

// Listen for the submit event and call addTodo when a submit happens.
todoForm.addEventListener("submit",addTodo);

function addTodo(event) {
  //Functions
  event.preventDefault();
  //Prevent form from submitting
  //Todo DIV
  const todoDiv = document.createElement("div");
  todoDiv.classList.add("todo");
  //Create LI
  const newTodo = document.createElement("li");
  newTodo.innerText = todoInput.value;
  newTodo.classList.add("todo-item");
  todoDiv.appendChild(newTodo);
  //CHECK MARK BUTTON
  const completedButton = document.createElement("button");
  completedButton.innerHTML = '<i class="fas fa-check"></i>';
  completedButton.classList.add("complete-btn");
  todoDiv.appendChild(completedButton);
  //CHECK trash BUTTON
  const trashButton = document.createElement("button");
  trashButton.innerHTML = '<i class="fas fa-trash"></i>';
  trashButton.classList.add("trash-btn");
  todoDiv.appendChild(trashButton);
  //APPEND TO LIST
  todoList.appendChild(todoDiv);
}
<header>
  <h1>My Todo List</h1>
</header>
<form id="todo-form">
  <input type="text" class="todo-input">
  <button class="todo-button" type="submit">Add</button>
</form>
<div class="todo-container">
  <ul class="todo-list"></ul>
</div>

,

创建一个addTodo函数并

todoButton.addEventListener("click",(e) => {
    e.preventDefault(); //event.preventDefault()
    addTodo();
});

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

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-