【问题标题】:Confirm deletion alert code not quite right确认删除警报代码不太正确
【发布时间】:2019-01-29 10:54:25
【问题描述】:

我正在 JS 中创建一个简单的待办事项应用程序,并且我添加了一个警告框以在 usr 单击删除按钮时确认删除。如果用户单击“确定”,则删除正常,如果单击“取消”,则不会删除,但会创建另一个空 li标签在它下面。

我的 deleteItem 函数有些地方不太对劲,但我不知道是什么,尝试添加 else 语句时会发生同样的事情。任何有关解释的帮助将不胜感激(如您所知,我是 JS 中的菜鸟)。谢谢!

//grab form id first
let ourForm = document.getElementById("ourForm");
let ourField = document.getElementById("ourField");
let OurList = document.getElementById("ourList");

 //on submit event from user, do something
ourForm.addEventListener("submit", (e) =>{
  //will prevent alert appearing on any click event around form, ONLY when submit button is clicked.
    e.preventDefault();
    //access value of user input as a test
    //console.log(ourField.value);

  //now on submit we're gonna pass the function below which is created further down and takes one argument and its value:
    if(ourField.value === ""){
      alert("Please add a task")
    }else{
      createItem(ourField.value);
    }
})

function createItem(item) {
    let createdHTML = `<li>${item} <button 
    onclick="deleteItem(this)">Delete</button></li>`;
    ourList.insertAdjacentHTML("beforeend", createdHTML);

  //clear the inpur field value after user input:
    ourField.value = "";

  //keep field focused after clearing 
    ourField.focus();
}

function deleteItem(itemToDelete){
    //create alert
    let result = confirm("Are you sure you want to delete?");
    if (result === true) {
    //Logic to delete the item
    itemToDelete.parentElement.remove();
    ourField.focus();
  }
}
<h1> Todo App</h1>
<form id="ourForm">
  <input id = "ourField" type="text" autocomplete="off">
  <button> Create item</button>

  <h3>To do tasks:</h3>
  <ul id="ourList">
  </ul>

【问题讨论】:

  • “如果单击“取消”,它不会删除,但会在其下创建另一个空的 li 标签” - 当我运行你的 sn-p 时,我不能重现那个……我没有看到任何空的 LI 出现在任何地方。
  • 对我来说,它似乎也很完美......

标签: javascript ecmascript-6


【解决方案1】:

您需要更改的是:将列表项的按钮设为button 类型。按钮的默认值typesubmit,它将提交整个表单,这将触发您的问题。

//grab form id first
let ourForm = document.getElementById("ourForm");
let ourField = document.getElementById("ourField");
let OurList = document.getElementById("ourList");

 //on submit event from user, do something
ourForm.addEventListener("submit", (e) =>{
  //will prevent alert appearing on any click event around form, ONLY when submit button is clicked.
    e.preventDefault();
    //access value of user input as a test
    //console.log(ourField.value);

  //now on submit we're gonna pass the function below which is created further down and takes one argument and its value:
    if(ourField.value === ""){
      alert("Please add a task")
    }else{
      createItem(ourField.value);
    }
})

function createItem(item) {
    let createdHTML = `<li>${item} <button 
    onclick="deleteItem(this)" type="button">Delete</button></li>`;
    ourList.insertAdjacentHTML("beforeend", createdHTML);

  //clear the inpur field value after user input:
    ourField.value = "";

  //keep field focused after clearing 
    ourField.focus();
}

function deleteItem(itemToDelete){
    //create alert
    let result = confirm("Are you sure you want to delete?");
    if (result === true) {
    //Logic to delete the item
    itemToDelete.parentElement.remove();
    ourField.focus();
  }
}
<h1> Todo App</h1>
<form id="ourForm">
  <input id = "ourField" type="text" autocomplete="off">
  <button> Create item</button>

  <h3>To do tasks:</h3>
  <ul id="ourList">
  </ul>

【讨论】:

    【解决方案2】:

    您忘记关闭按钮后的form 标记,结果您的ourForm 侦听器即使在确认框内也会被调用。

    //grab form id first
    let ourForm = document.getElementById("ourForm");
    let ourField = document.getElementById("ourField");
    let OurList = document.getElementById("ourList");
    
     //on submit event from user, do something
    ourForm.addEventListener("submit", (e) =>{
      //will prevent alert appearing on any click event around form, ONLY when submit button is clicked.
        e.preventDefault();
        //access value of user input as a test
        //console.log(ourField.value);
    
      //now on submit we're gonna pass the function below which is created further down and takes one argument and its value:
        if(ourField.value === ""){
          alert("Please add a task")
        }else{
          createItem(ourField.value);
        }
    })
    
    function createItem(item) {
        let createdHTML = `<li>${item} <button 
        onclick="deleteItem(this)">Delete</button></li>`;
        ourList.insertAdjacentHTML("beforeend", createdHTML);
    
      //clear the inpur field value after user input:
        ourField.value = "";
    
      //keep field focused after clearing 
        ourField.focus();
    }
    
    function deleteItem(itemToDelete){
        //create alert
        let result = confirm("Are you sure you want to delete?");
        if (result === true) {
        //Logic to delete the item
        itemToDelete.parentElement.remove();
        ourField.focus();
      }
    }
    <h1> Todo App</h1>
    <form id="ourForm">
      <input id = "ourField" type="text" autocomplete="off">
      <button> Create item</button>
    </form>
    
      <h3>To do tasks:</h3>
      <ul id="ourList">
      </ul>

    【讨论】:

    • 嘿,感谢您指出这一点!事实上,我忘记了表单的结束标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-12-27
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多