微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript删除模态onclick并减少计数器

如何解决JavaScript删除模态onclick并减少计数器

我想做一个基本的收件箱功能。它包含 3 条消息。 所以我想在用户点击 DELETE 按钮时做到这一点,将 msg1 的显示设置为无,并减少消息值。 下面是示例代码

var x = 2;

function deleteMsg1() {
  
  var msg1 = document.getElementsByClassName("cont");
    if (confirm("Are you sure to want to delete this message?")) {
      msg1[0].style.display = "none";
      x = x-1;
    } else {

    }

}

function deleteMsg2() {
  
  var msg2 = document.getElementsByClassName("cont2");
    if (confirm("Are you sure to want to delete this message?")) {
      msg2[0].style.display = "none";
      x = x-1;
    } else {

    }

}

document.getElementById("msgcount").innerHTML = x;
.cont,.cont2 {
background-color: red;
padding: 5px;
width: 100px;
margin: 25px 0;
}

.show {
display: block;
}
<h1>There are <span id="msgcount"></span>messages</h1>
<button onclick="deleteMsg1()">Delete</button>
<div class="cont">
  Some text...
</div>
<br><br>
<button onclick="deleteMsg2()">Delete</button>
<div class="cont2">
  Some text...
</div>

我知道这不是最好的主意,但我想这很糟糕。 我想我应该用一个 function() 来做这件事并尝试一些事件监听器,但我真的不知道该怎么做。 有什么想法或帮助吗?

解决方法

说明

这是一个足够简单的解决方案,每次要更新 x 的值时都需要手动更新 HTML。这就是为什么我创建了一个 updateX 函数,它只会获取值并更新 DOM,就这么简单。

const updateX = (x) => {
  document.getElementById("msgcount").innerHTML = x;
};

let x = 2;

const del = (className) => {
  const msg = document.getElementsByClassName(className);

  if (confirm("Are you sure to want to delete this message?")) {
    msg[0].style.display = "none";
    x--;
  } else {
    console.log("===");
  }

  updateX(x);
};

updateX(x);
.cont,.cont2 {
  background-color: red;
  padding: 5px;
  width: 100px;
  margin: 25px 0;
}

.show {
  display: block;
}
<h1>There are <span id="msgcount"></span>messages</h1>
<button onclick="del('cont')">Delete</button>
<div class="cont">
  Some text...
</div>
<br/><br/>
<button onclick="del('cont2')">Delete</button>
<div class="cont2">
  Some text...
</div>

,

您应该将每条消息的 HTML 包装在一个父元素中,这样您就可以将构成一条消息的每组元素视为一个单元并一次性将其全部删除。

为了能够使用单个函数执行此操作,您可以使用 this 来引用首先触发回调函数的元素,并使用 .closest() 来访问单父包装器。>

注意事项

// Do your event binding in JavaScript,not HTML
document.querySelectorAll("button").forEach(function(element){
  element.addEventListener("click",function(){
    if (confirm("Are you sure to want to delete this message?")) {
      // All you need to do is delete the nearest complete
      // ancestor message construct,which can be done with
      // the .closest() method
      this.closest(".message").remove();
      updateMessageCount();
    }
  });
});

function updateMessageCount(){
  // Set the count equal to the length of the 
  // collection returned by searching for all the
  // messages
  document.getElementById("msgcount").textContent =
       document.querySelectorAll(".message").length;
}

updateMessageCount();
.cont,.cont2 {
background-color: red;
padding: 5px;
width: 100px;
margin: 25px 0;
}

.show {
display: block;
}
<h1>There are <span id="msgcount"></span> messages</h1>

<!-- By wrapping each message,you can treat all its HTML
     as one single unit. -->
<div class="message">
  <button>Delete</button>
  <div class="cont">
    Some text...
  </div>
</div>
<br><br>
<div class="message">
  <button>Delete</button>
  <div class="cont">
    Some text...
  </div>
</div>

,

我给你的建议:永远不要html结构tags内声明事件js!如这里:

<button onclick="deleteMsg1()">Delete</button>

这是一种非常糟糕的做法。这有很多缺点。这可能会导致不良后果。

我使用 forEach() 方法为您制作了一个解决方案,而没有在 html 中使用 javascript。

删除按钮也被删除了。

let msg = document.querySelectorAll(".cont");
let btn_del = document.querySelectorAll('.btn_del');
let x = 2;

btn_del.forEach(function (btn_del_current,index) {
    btn_del_current.addEventListener('click',function () {
        if (confirm("Are you sure to want to delete this message?")) {
            this.style.display = "none";
            msg[index].style.display = "none";
            x = x - 1;
            document.getElementById("msgcount").innerHTML = x;
        } else {}
    });
});
.cont,.cont2 {
  background-color: red;
  padding: 5px;
  width: 100px;
  margin: 25px 0;
}

.show {
  display: block;
}
<h1>There are <span id="msgcount"></span>messages</h1>
<button class="btn_del">Delete</button>
<div class="cont">
  Some text...
</div>
<br><br>
<button class="btn_del">Delete</button>
<div class="cont">
  Some text...
</div>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?