简体   繁体   中英

Use multiple dropdowns with the same Js function

I have this column where I am supposed to display products

Right now the 1st dropdown only opens I want the user to able to open all of them in order to see all products

I am using the standard pure Js dropdown model

 function myFunction() { document.getElementById("myDropdown").classList.toggle("show"); } // Close the dropdown if the user clicks outside of it window.onclick = function(event) { if (!event.target.matches('.dropbtn')) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains('show')) { openDropdown.classList.remove('show'); } } } }
 <div class="dropdown"> <button onclick="myFunction()" class="dropbtn">Products1 or 2</button> <div id="myDropdown" class="dropdown-content"> <img src="images/E11A.png" class="bottles" /> <img src="images/E11A.png" class="bottles" /> </div> </div>

As I said in the comment you can't have multiple elements with the same name.

So what we could do given the html you have provided, is add this to onclick="myFunction()" and then do the following:

function myFunction(obj) {
  obj.nextElementSibling.classList.toggle("show");
}

Working Demo

 /* When the user clicks on the button, toggle between hiding and showing the dropdown content */ function myFunction(obj) { obj.nextElementSibling.classList.toggle("show"); } // Close the dropdown if the user clicks outside of it window.onclick = function(event) { if (!event.target.matches('.dropbtn')) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains('show')) { openDropdown.classList.remove('show'); } } } }
 * { box-sizing: border-box; } body { background-color: grey; background-size: 100%; background-image: url('g50.png'); background-repeat: repeat; } html, body { height: 100%; margin: 0px; } .container { width: 100%; height: 1080px; display: flex; flex-direction: row; } .a { float: left; width: 250px; height: 100%; border: 1px solid blue; } .dropbtn { width: 98%; padding: 14px; background-color: #3498DB; color: white; padding: 14px; font-size: 16px; border: none; cursor: pointer; } .dropbtn:hover, .dropbtn:focus { background-color: #2980B9; } .dropdown { width: 100%; display: inline-block; } .dropdown-content { width: 100%; height: 200px; overflow: scroll; display: none; background-color: #f1f1f1; box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); z-index: 1; } .dropdown-content a { color: black; padding: 12px 16px; text-decoration: none; display: block; } .dropdown a:hover { background-color: #ddd; } .show { display: block; }
 <div class="container"> <div class="a"> <div class="dropdown"> <button onclick="myFunction(this)" class="dropbtn">Dropdown</button> <div class="dropdown-content"> <img src="images/E11A.png" class="bottles" /> <img src="images/E11A.png" class="bottles" /> </div> <div class="dropdown"> <button onclick="myFunction(this)" class="dropbtn">Dropdown</button> <div class="dropdown-content"> <img src="images/E11A.png" class="bottles" /> <img src="images/E11A.png" class="bottles" /> </div> </div> </div> </div> </div>

First, you should not be using the same id twice try using a class instead, eg

<button onclick="myFunction()" class="dropbtn">Dropdown</button>
<div class="myDropdown dropdown-content">
  <img src="images/E11A.png" class="bottles"/>
  <img src="images/E11A.png" class="bottles"/>
</div>

Then in your javascript you can simply write the following to open both dropdowns

function myFunction() {
  document.querySelectorAll("myDropdown").forEach(el => el.classList.toggle("show"));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM