javascript - 将 DOM 元素插入变量并使用其属性与不使用变量执行相同操作之间的区别

标签 javascript foreach

我正在尝试创建一个 JS 计算器。

<div class="container">
    <div class="input"></div>
    <button class="num" id="num1">1</button>
    <button class="num" id="num2">2</button>
    <button class="num" id="num3">3</button>
    <button class="num" id="num4">4</button>
    <button class="num" id="num5">5</button>
    <button class="num" id="num6">6</button>
    <button class="num" id="num7">7</button>
    <button class="num" id="num8">8</button>
    <button class="num" id="num9">9</button>
    <button class="num" id="num0">0</button>
    <button class="equal">=</button>
    <button class="plus">+</button>
    <button class="minus">-</button>
  </div>

我刚刚开始编写代码来显示被单击的数字,并且想知道为什么此代码有效:

    document.querySelectorAll('.num').forEach(el => {
      el.addEventListener('click', () => {
        document.querySelector('.input').textContent += el.textContent;
      })
    })

虽然此代码没有:

var value = document.querySelector('.input').textContent;
    document.querySelectorAll('.num').forEach(el => {
      el.addEventListener('click', () => {
        value += el.textContent;
      })
    })

它们不是一样的吗?唯一的区别是,在第二个示例中,变量保存 querySelector 和 textContent 属性。

最佳答案

var value = document.querySelector('.input').textContent;

该行的作用与您想象的不同。它不会在变量 value 中存储对元素文本内容的引用;相反,它存储。这是一个字符串。在 JavaScript 中,字符串是不可变的,这意味着它们一旦创建就无法更改。当您执行诸如 value += 'hello' 之类的操作时,您实际上是在创建一个带有附加字符的新字符串,而原始字符串保持不变。

您想要做的是存储对 DOM 元素本身的引用,以便您可以在循环中为其 textContent 分配新值:

var element = document.querySelector('.input');
document.querySelectorAll('.num').forEach(el => {
  el.addEventListener('click', () => {
    element.textContent += el.textContent;
  })
})

关于javascript - 将 DOM 元素插入变量并使用其属性与不使用变量执行相同操作之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59776890/

相关文章:

javascript - 无法从订阅的服务获取 .then 方法

javascript - 在JS哈希中按频率获取一个值,而不丢失其他键和值

javascript - 如何将图像从url加载到nodejs的缓冲区中

mysql - 异步 waterfall 中带有 Mysql 连接池的 ForEach 函数

javascript - 服务器端 Controller 如何处理来自客户端的多个 session ?

javascript - 添加到 javascript 关联数组

java - Spark toLocalIterator 和迭代器方法之间的区别

java - 如何通过 Java 中的 foreach 循环实现相同的结果

mysql - 在 codeigniter 中上传后获取文件名作为数组

php - Laravel 5.1 无法在集合上使用 @foreach