javascript - 如何在 HTML DOM 中的父元素上分离 2 个子元素的 2 个事件

标签 javascript html

我想选择和删除 2 个函数,但是当我单击选择它触发函数删除时发生了一些错误,我在控制台上看到了值 NaN。我该如何解决这个问题?

        var collect = document.getElementById('collect');
        collect.addEventListener('change', onChange);
        collect.addEventListener('click', onDelete);
        
        function onChange(event) {
            var changeButton = event.target;
            i = parseInt(changeButton.dataset.select);
            console.log(i);
        }

        function onDelete(event) {
            var deleteButton = event.target;
            i = parseInt(deleteButton.dataset.delete);
            console.log(i); 
        }
.card {
    width: 300px;
    height: 80px;
    background-color: blue;
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
    align-items: start;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    
    <div id="collect">
        <div class="card">
            <button data-delete='1'>Delete</button>
            CARD 1
            <select name="" id="" data-select='1'>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
        </div>
        <div class="card">
            <button data-delete='2'>Delete</button>
            CARD 2
            <select name="" id="" data-select='2'>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
        </div>
        <div class="card">
            <button data-delete='3'>Delete</button>
            CARD 3
            <select name="" id="" data-select='3'>
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
        </div>
    </div>

另外, 第二个问题:我还不知道删除卡片的最佳方法。我确实使用了 jquery $("button[data-delete='"+ i + "']").parents('.card').remove();。但这似乎不太好:(。你能帮帮我吗?

最佳答案

单击选择控件会触发 click 事件并运行 onDelete 处理程序(因为它会监听 click 事件)。因此,您需要防止在 onDelete 处理程序中处理对选择控件的点击。它可以通过使用 nodeName 检查被点击元素的类型来实现。属性(property)。

要删除卡,您可以使用 How to remove the parent element using plain javascript 中的解决方案话题。因此,结果代码如下。

var collect = document.getElementById('collect');
collect.addEventListener('change', onChange);
collect.addEventListener('click', onDelete);

function onChange(event) {
  var changeButton = event.target;
  if (changeButton.nodeName !== 'SELECT')
    return false;
  i = parseInt(changeButton.dataset.select);
  console.log(i);
}

function onDelete(event) {
  var deleteButton = event.target;
  if (deleteButton.nodeName !== 'BUTTON')
    return false;
  i = parseInt(deleteButton.dataset.delete);
  console.log(i);
  deleteButton.parentNode.parentNode.removeChild(deleteButton.parentNode);
}
.card {
  width: 300px;
  height: 80px;
  background-color: blue;
  margin-bottom: 10px;
  display: flex;
  justify-content: space-between;
  align-items: start;
}
<div id="collect">
  <div class="card">
    <button data-delete='1'>Delete</button> CARD 1
    <select name="" id="" data-select='1'>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <div class="card">
    <button data-delete='2'>Delete</button> CARD 2
    <select name="" id="" data-select='2'>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
  <div class="card">
    <button data-delete='3'>Delete</button> CARD 3
    <select name="" id="" data-select='3'>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
  </div>
</div>

还可以使用来自 Native addEventListener with selector like .on() in jQuery 的类和解决方案来分离事件源主题。

祝你好运,编码愉快! ;)

关于javascript - 如何在 HTML DOM 中的父元素上分离 2 个子元素的 2 个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675441/

相关文章:

javascript - 在函数内动态创建多个函数

html - html5中的YouTube视频未显示我选择的视频

jquery - 移动设备上的 Bootstrap 轮播

html - 使用首字母时删除多余的空格

javascript - 按钮 Javascript 问题的文本输出

Javascript从数组中的给定范围内选择随机数

javascript - 通过将鼠标悬停在图像上来滚动 div 的内容

javascript - 为什么这个 JavaScript 程序比 C++ 更快地填充一个大数组?

html - IE8 中的页脚问题

javascript - 使用 window.frames 属性获取 iframe 与 iframe ID