您将如何使用JavaScript创建取消隐藏/隐藏内容的切换按钮?

问题描述

我试图隐藏单击按钮时显示的内容。

这是我的起始HTML:

        <div class="sunrise-section" id="hide-show">
          <h3>SUNRISE</h3>
          <p class="sunrise">5:40 A.M.</p>
        </div>

        <div class="sunset-section" id="hide-show">
          <h3>SUNSET</h3>
          <p class="sunset">8:05 P.M.</p>
        </div>

        <div class="navbar-bottom">
            <button onclick="onClick"><img src="https://image.flaticon.com/icons/svg/892/892499.svg" alt="click for details" height="18px" id="navbar-bottom-button"></button>
        </div>

这是我的入门JavaScript(onClick函数是最后一个;我包括了所有用于显示上下文的内容):

window.addEventListener('load',()=> {
    let long;
    let lat;
    let locationTimeZone = document.querySelector('.location-timezone');
    let temperatureDegree = document.querySelector('.temperature-degree');
    let humidity = document.querySelector('.humidity');
    let todayDate = document.querySelector('.today-date');
    let windSpeed = document.querySelector('.wind-speed');
    let visibility = document.querySelector('.visibility');
    let pressure = document.querySelector('.pressure');
    let sunrise = document.querySelector('.sunrise');
    let sunset = document.querySelector('.sunset');
    let myDate = new Date();

    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(position => {
            long = position.coords.longitude;
            lat = position.coords.latitude;

            const proxy = 'https://cors-anywhere.herokuapp.com/';
            const api = `${proxy}https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${long}&appid=d5f88bf8e740a9d82677f46f346f0a33&units=Imperial`;
        
            fetch(api) 
            .then(response => {
                return response.json();
                })
                .then(data => {
                    console.log(data);

                    // Set Sunrise 
                    let sunriseDate = new Date(data.sys.sunrise * 1000);
                    let sunriseHours = sunriseDate.getHours();
                    let sunriseMinutes = sunriseDate.getMinutes();
                    

                    // Set Sunset 
                    let sunsetDate = new Date(data.sys.sunset * 1000);
                    let sunsetHours = sunsetDate.getHours();
                    let sunsetMinutes = sunsetDate.getMinutes();

                    // Add 0 Before Minutes if Less than 10
                    if(sunsetMinutes.toString().length < 2)
                    sunsetMinutes = "0" + sunsetMinutes

                    if(sunriseMinutes.toString().length < 2)
                    sunriseMinutes = "0" + sunsetMinutes 

                    // Set DOM Elements from the API 
                    locationTimeZone.textContent = data.name;
                    temperatureDegree.textContent = Math.round(data.main.temp);
                    humidity.textContent = data.main.humidity + '%';
                    todayDate.textContent = myDate.format('l F d') + 'th,' + myDate.format('Y');
                    windSpeed.textContent = data.wind.speed + ' MPH';
                    visibility.textContent = Math.round(data.visibility / 1609) + '+ Mi';
                    pressure.textContent = data.main.pressure + ' mb';
                    sunrise.textContent = sunriseHours + ":" + sunriseMinutes + " A.M.";
                    sunset.textContent = (sunsetHours - 12) + ":" + sunsetMinutes + " P.M.";

                    // Set Icon
                    let iconCode = data.weather[0].icon;
                    let iconUrl = "http://openweathermap.org/img/wn/" + iconCode + "@2x.png";
                    $('#weather-icons').attr('src',iconUrl);

                    // Toggle Hide / Unhide Button 
                    function onClick() {let x = document.getElementById("hide-show");
                    if (x.style.display === "none") {
                        x.style.display = "block";} 
                    else {x.style.display = "none";}
            }
                    
        } )

        });
    }
}); 

我尝试将.getElementById(“ hide-show”)更改为document.querySelectorAll('[id = hide-show]'),但没有任何改变。

我非常感谢您提供的任何可以帮助我更好地理解此问题的信息!

解决方法

我认为,如果您的JavaScript位于单独的文件中,则永远不会调用onClick函数。 这是一种简单的方法,称为事件委托,最好是在循环中只有一个侦听器而不是多个侦听器。

let elements = document.querySelectorAll('.hide-show');

document.addEventListener('click',e => {
   if (e.target.closest('button')) {
      elements.forEach(el => {
         el.classList.contains('hidden') ? el.classList.remove('hidden') : el.classList.add('hidden');
      })
   }
})
.hidden {
  display: none
}
<div class="sunrise-section hide-show" id="one">
  <h3>SUNRISE</h3>
  <p class="sunrise">5:40 A.M.</p>
</div>
<div class="sunset-section hide-show" id="two">
  <h3>SUNSET</h3>
  <p class="sunset">8:05 P.M.</p>
</div>

        <div class="navbar-bottom">
            <button><img src="https://image.flaticon.com/icons/svg/892/892499.svg" alt="click for details" height="18px" id="navbar-bottom-button"></button>
        </div>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...