通过单击项目显示对象中的相应值(HTML 和 Javascript)

Show Corresponding Value in an Object by Clicking an Item (HTML and Javascript)

我正在尝试做到这一点,以便单击我的列表中的任何项目然后 return 另一个部分中的值,基于我定义的对象。在这种情况下,单击 countryName 应该会在另一部分中显示 infoNarrative。

这是我到目前为止所了解的(我显然是 HTML/Javascript 的初学者,解决这些问题对我的学习很有帮助)。请随时提出任何更明智的建议,我也很乐意学习其他简单的方法。

HTML

<div class="sidebar">
  <div class="heading">
    <h1>Countries</h1>
  </div>
    <ul class="countryList">
    <li id = "afghanistan">Afghanistan</li>
    <li id = "bangladesh">Bangladesh</li>
    </ul>  
<div id="narrative" class="narrative">
    Narrative Should Turn Up Here</div>

Javascript

    'afghanistan': {
        countryName: 'Afghanistan',
        'infoNarrative': 'afg lorem ipsum dolor sit amet',
        'link': 'google.com'
    },
    'bangladesh': {
        countryName: 'Bangladesh',
        'infoNarrative': 'bgd lorem ipsum dolor sit amet',
        'link': 'google.com'
    }
    };
    
    
    document.getElementById("afghanistan").addEventListener("click", displayNarrative());
    
    function displayNarrative(testValue) {
        document.getElementById("narrative").innerHTML = countryData.testValue.infoNarrative;
    }

我认为基本问题是当您尝试设置 innerHTML 时,您需要使用 countryData[testValue] 而不是 countryData.testValue。第一个将查找一个键,它是 testValue 变量的值。第二个将查找不在您的数据集中的“testValue”键。

另外,当您添加事件侦听器时,您正在调用 displayNarrative,而不是将那个东西交给一个在点击时执行的函数。

这是一个稍作补充的可行解决方案。我将 class="countryItem" 添加到 html li 标签中,以便您可以轻松地 select 列表中的所有 项目并附加事件侦听器给他们。

document.addEventListener("DOMContentLoaded", () => {
  const countryData = {
    afghanistan: {
      countryName: "Afghanistan",
      infoNarrative: "afg lorem ipsum dolor sit amet",
      link: "google.com"
    },
    bangladesh: {
      countryName: "Bangladesh",
      infoNarrative: "bgd lorem ipsum dolor sit amet",
      link: "google.com"
    }
  };

  const items = document.getElementsByClassName('countryItem')
  Array.from(items).forEach(function(item) {
    item.addEventListener('click', function() {
      displayNarrative(item.id)
    })
  })

  function displayNarrative(countryKey) {
    const countryInfo = countryData[countryKey]
    document.getElementById("narrative").innerHTML =
      countryInfo.infoNarrative;
  }
});
<div class="sidebar">
  <div class="heading">
    <h1>Countries</h1>
  </div>
  <ul class="countryList">
    <li class="countryItem" id="afghanistan">Afghanistan</li>
    <li class="countryItem" id="bangladesh">Bangladesh</li>
  </ul>
  <div id="narrative" class="narrative">
    Narrative Should Turn Up Here</div>
</div>