【问题标题】:Dropdown on click doing nothing点击下拉菜单什么都不做
【发布时间】:2022-01-25 02:26:10
【问题描述】:

我刚刚开始 JS,所以这可能是一个愚蠢的问题。我想做一个下拉菜单,如果您选择一个选项,相关段落将可见。我真的不知道如何开始,所以我创建了 cars 函数,以便在单击 e38 按钮时使“e38value”段落可见,但是当我单击它时没有任何反应,我不知道为什么。如果有人知道这样做的更好方法并且它不是那么复杂并且初学者可以理解它,如果您能与我分享,我将非常高兴。

var e38 = document.querySelectorAll('e38value')

function cars() {
  document.querySelectorAll('e38').onclick = function() {
    console.log('clicked');
    e38.classList.toggle("e38hidden");
  }
}
.e38hidden {
  display: none;
}
<nav>
  <menu>
    <menuitem id="kocsid">
    <a>Amilyen kocsid van</a>
    <menu>
      <menuitem id="Audi">
      <a>Audi</a>
      <menu>
        <menuitem><a>Audi</a></menuitem>
        <menuitem><a>Audi</a></menuitem>
        <menuitem><a>Audi</a></menuitem>
        <menuitem><a>Audi</a></menuitem>
      </menu>
      </menuitem>
      <menuitem id="BMW">
      <a>BMW</a>
      <menu>
        <menuitem><a class="e38">750 e38</a></menuitem>
        <menuitem><a>760 e65</a></menuitem>
        <menuitem><a>M3 e46</a></menuitem>
        <menuitem><a>M3 e62</a></menuitem>
      </menu>
      </menuitem>
      <menuitem id="Dodge">
      <a>Dodge</a>
      <menu>
        <menuitem onclick=""><a>Dodge</a></menuitem>
        <menuitem><a>Dodge</a></menuitem>
        <menuitem><a>Dodge</a></menuitem>
        <menuitem><a>Dodge</a></menuitem>
      </menu>
      </menuitem>
</nav>
<p id="e38value" class="e38hidden">e38 value</p>

【问题讨论】:

  • 你不仅在你的类选择器前面缺少了一个句点,你还应该知道document.querySelectorAll()返回一个NodeList而不是单个元素。

标签: javascript html css web


【解决方案1】:

可能还有其他更好的方法来完成它,但这里是如何修复你的脚本:

function cars() {
  document.querySelectorAll('.e38').forEach(function(e) {
    e.onclick = function(evt) {
      console.log('clicked', evt.target.innerHTML);
      document.getElementById("e38value").classList.toggle("e38hidden");
    }
  })
}

cars();

注意:

  1. 您需要调用cars() 来实际初始化事件。
  2. 选择器应为“.e38”,表示所有具有e38 类的元素
  3. 您需要调用 forEach,因为 querySelector 返回一个元素数组(在这种情况下只有一个元素)
  4. 点击事件可用于定位目标(点击的位置)。

这是一个小提琴:https://jsfiddle.net/b9728Lmk/1/

这能解决问题吗?

【讨论】:

  • 不,不幸的是它仍然没有显示出来。
  • @jayden 如果你打开小提琴并点击它应该消失的元素。
  • 我认为我们误解了对方。我选择按钮时,我希望一个段落显示为与所选事物相关。因此,例如,当您单击 bmw -> e38 时,它会显示一段包含有关汽车的一些信息。
  • 在这种情况下,将evt.target.classList.toggle("e38hidden"); 替换为document.getElementById("e38value").classList.toggle("e38hidden"); -- 这是您的预期吗?保存的小提琴:jsfiddle.net/Lbajoqfc
  • 我遇到了问题。我开始添加更多的 html 元素(一个小时,我也尝试了一个 h2),它突然停止工作,我不知道为什么。没有错误,什么都没有。
【解决方案2】:

您可以简单地定义一个onchange 事件,该事件将删除先前选择的项目的可见性并使当前选择的项目可见。

function selectSection(value) {
    let context = document.getElementById("sections");
    for (let visible of context.querySelectorAll("p.visible")) {
        visible.classList.remove("visible");
    }
    if (context.children[value]) context.children[value].classList.add("visible");
}
#sections > p:not(.visible) {
    display: none;
}
<select id="section-selector" onchange="selectSection(this.value)">
    <option value="">Please Select</option>
    <option value="0">First</option>
    <option value="1">Second</option>
    <option value="2">Third</option>
    <option value="3">Fourth</option>
    <option value="4">Fifth</option>
</select>

<div id="sections">
    <p>section 1</p>
    <p>section 2</p>
    <p>section 3</p>
    <p>section 4</p>
    <p>section 5</p>
</div>

【讨论】:

    【解决方案3】:

    这里是更新版本jsFiddle

    var  menuItemToClick = document.querySelectorAll('.e38')
    
    
    function cars(){
    // I use for here because the menuItemToClick is an array that containt all element having class name e38
      for (var i = 0; i < menuItemToClick.length; i++) {
          menuItemToClick[i].addEventListener('click', function(event) {
              console.log('clicked');
              ParagraphToHide = document.querySelectorAll('#e38value');
              //I use [0] because the ParagraphToHide is an array, as we use an id we are pretty sure that we will select the first element 
              ParagraphToHide[0].classList.toggle("e38hidden");
          });
      }
    } 
    
    cars();
    

    【讨论】:

    • 不幸的是,它仍然没有出现。 ://
    • 我更新了我的答案并添加了 JsFiddle 的链接供您测试
    • 谢谢,它在 JSFiddle 中运行良好,但我的代码有问题,因为它不会为我做任何事情。
    • 我刚刚改了Javascript,你能检查一下你浏览器的控制台,确保浏览器缓存被清除了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多