javascript - 如何将点击事件及其位置添加到按钮数组中?

标签 javascript html arrays button

我正在尝试添加一个事件,当我单击按钮时该事件会更改按钮的文本。然而,无论我点击哪一个,它总是会更改最后一个按钮的文本。

首先,我尝试将按钮传递给“pulsar”方法,并且总是最后一个按钮发生变化。我认为这可能是变量的引用,所以我尝试传递位置,但发生了同样的情况。

class Buscaminas{
    constructor () {
        this.botones = [];
        for (var i = 0; i < 8; i++) {
            for (var j = 0; j < 7; j++) {
                let boton = document.getElementById(i + "" + j);
                boton.textContent = "Hi";
                boton.onclick = e => {
                    this.pulsar(6*i+j);
                }
                this.botones.push(boton);
            }
        }
    }

    pulsar = (n) => {
        console.log(n);
        this.botones[n].textContent = "Bye";
    }
}

console.log 总是打印 55

最佳答案

您的处理方式不正确。

在有很多元素的情况下,您永远不想向每个元素添加一堆单独的事件处理程序。您希望在根节点处创建一个事件处理程序,其中每个子元素的单击事件都会冒泡。

在此示例中,我们有 10 个 div:

<div id="btn-root">
  <input type="button" class="btn" value="1">
  <input type="button" class="btn" value="2">
  <input type="button" class="btn" value="3">
  <input type="button" class="btn" value="4">
  <input type="button" class="btn" value="5">
  <input type="button" class="btn" value="6">
  <input type="button" class="btn" value="7">
  <input type="button" class="btn" value="8">
  <input type="button" class="btn" value="9">
  <input type="button" class="btn" value="10">
</div>

我们有这个简单的代码来监听任何子“.btn”元素的点击:

class Buscaminas {
  constructor() {
    document.querySelector('#btn-root').addEventListener('click', (evt) => {
      evt.target.textContent = Math.random();
    }); 
  }
}

new Buscaminas();

如果您运行该程序,您会发现每次单击其中一个按钮时,其内容都会被替换为随机数。

稍后编辑:

假设您想要查找被单击元素的索引。我们仍然不想为每个元素分配单独的事件处理程序,但我们没有提供父级中目标元素的索引。

为了解决这个问题,我们要搜索 #btn-root 的子节点,直到匹配为止。二进制搜索在这里不起作用,但我们想要比仅执行线性搜索的 indexOf 更好的东西。我们可以做的只是循环数组一半的长度并检查两端。这样我们就可以相当高效地获取索引了。

document.querySelector('#btn-root').addEventListener('click', (ev) => {
  const children = ev.target.parentNode.children;

  for (let i = 0; i < Math.floor(children.length / 2); i++) {
    const lowMatch = ev.target === children[i] && i;
    const highMatch = ev.target === children[children.length - 1 - i] && children.length - 1 - i;
    const index = Number.isInteger(lowMatch) && lowMatch || Number.isInteger(highMatch) && highMatch;

    if (index) {
      ev.target.value = `${index + 1}-${Math.random()}`;
      break;      
    }
  }
});

关于javascript - 如何将点击事件及其位置添加到按钮数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59020948/

相关文章:

javascript - 如何使用 jQuery.getJSON() 读取远程 JSON 文件?

javascript - 使用 HTML/css/javascript(响应式设计)打印宽 html 表格

html - 复选框不适用于 materializecss - HTML、CSS

php - 在php中为优惠券代码设置自动增量变量

python - 来自数组和 np.dtype 对象的结构化数组

java - 覆盖自身的字符串数组列表

Php,检查对象数组中是否存在属性=值的对象

javascript 验证文本框的数字和字符串

html - 带有 Flexbox 列表项的标签的垂直对齐

javascript - 成员函数的 JS 最佳实践