javascript - JS - 单击按钮将元素的文本更改为未定义

标签 javascript html

点击‘hi’和‘helo’按钮必须按照计划将'.admin-text'的内容更改为各自的文本,但它只是将其更改为'未定义'

var admin_text = document.querySelector('.admin-text');

var infra_btns = [document.getElementById('hi'), document.getElementById('helo')];


var infra_html = ["<p>hi</p>", "<p>helo</p>"];

for(var i = 0; i < 2; i++)
{
  infra_btns[i].addEventListener('click', function() {
    admin_text.innerHTML = infra_html[i];
  });
}
<div class="admin">
  <div class="admin-nav">
    <button class="adminbtns" id="hi">hi</button>
    <button class="adminbtns" id="helo">helo</button>
  </div>

  <div class="admin-text">

  </div>
</div>

最佳答案

你就快到了 - 你需要在 for 循环中使用 let 而不是 var,否则 i 在所有监听器函数中等于 2:

var admin_text = document.querySelector('.admin-text');

var infra_btns = [hi, helo];


var infra_html = ["<p>hi</p>", "<p>helo</p>"];

for (let i = 0; i < 2; i++) {
  infra_btns[i].addEventListener('click', function() {
    admin_text.innerHTML = infra_html[i];
  });
}
<div class="admin">
  <div class="admin-nav">
    <button class="adminbtns" id="hi">hi</button>
    <button class="adminbtns" id="helo">helo</button>
  </div>
  <div class="admin-text"></div>
</div>

发生这种情况是因为使用 var 声明的变量具有函数作用域,并且监听器函数中的 i 通过引用传递 strong>,而不是按,因此所有听众共享相同的i。在最后一次迭代之后,for 循环所做的最后一件事是 i++,因此 i 等于 2。因此您的监听器尝试访问 infra_html[2] 这是未定义,因为您的数组没有具有该索引的元素。

这篇文章详细解释了:JQuery not appending correct value to unordered list

关于javascript - JS - 单击按钮将元素的文本更改为未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972711/

相关文章:

javascript - 有没有办法在 Web Worker 中创建 DOM 元素?

html - CSS 填充方案

两侧带有自定义图像的 JavaScript 硬币翻转动画

javascript - Windows Server 上的 Imacros SAVEAS 功能

javascript - 只需要获取 ID 的一部分(最后一个下划线之后的所有内容)

javascript - 使用带有 2 个按钮的 jQuery 旋转图像

javascript - 每次使用 jQuery,scrollTop() 返回零

javascript - vbscript `Is Nothing` 的 javascript 等价物是什么

javascript - 如何在不使用 Ajax 的情况下将值从 PHP 传递到 Javascript?

c# - 从网络中的 UNC 路径加载图像并隐藏该路径