簡體   English   中英

為什么一個功能起作用而另一個功能不起作用? (JavaScript)的

[英]Why does one function work and the other one doesn't work? (Javascript)

我正在一個項目上進行練習,並且嘗試使用模塊模式,因為我想盡可能避免使用全局變量。

我的自動滑動和下拉菜單運行正常。 但是,當我單擊“主題”時,將顯示子菜單,同時,我的圖像也在滑動。

為什么劑量子菜單突然消失?

 var slideShow = (function () { var slideImages = document.getElementsByClassName("slide"); var leftSide = document.getElementById("arrow-left"); var rightSide = document.getElementById("arrow-right"); var slideBullets = document.getElementsByClassName("bullets"); var current = 0; function reset() { for (let i = 0; i < slideImages.length; i++) { slideImages[i].style.display = 'none'; slideBullets[i].classList.remove("clicked"); } }; function showImages() { for (let i = 0; i < slideImages.length; i++) { slideImages[0].style.display = 'block'; slideBullets[current].classList.add("clicked"); } }; function arrowSlide() { leftSide.addEventListener("click", function () { reset(); if (current === 0) { current = slideImages.length; } slideImages[current - 1].style.display = 'block'; current--; slideBullets[current].classList.add("clicked"); }); rightSide.addEventListener("click", function () { reset(); if (current === slideImages.length - 1) { current = - 1; } slideImages[current + 1].style.display = 'block'; current++; slideBullets[current].classList.add("clicked"); }); }; function showBulletsImages() { for (let i = 0; i < slideBullets.length; i++) { slideBullets[i].addEventListener("click", function () { reset(); slideImages[i].style.display = 'block'; slideBullets[i].classList.add("clicked"); current = i; }); } }; function autoSlide() { setInterval(function () { rightSide.click(); slideBullets[current].classList.add('clicked') }, 2000); }; return { reset: reset(), showImages: showImages(), arrowSlide: arrowSlide(), showBulletsImages: showBulletsImages(), autoSlide: autoSlide() }; })(); var toggleMenu = (function () { var mainTopics = document.getElementById("maintopics"); mainTopics.addEventListener("click", function (e) { e.preventDefault(); e.stopImmediatePropagation(); mainTopics.classList.toggle("show"); }); document.addEventListener("click", function () { mainTopics.classList.remove("show"); }); return { toggleMenu: toggleMenu() }; })(); 
 body { margin: 0; } li, a{ text-decoration: none; list-style-type: none; text-decoration-line: none; color: black; } /*main-menu*/ #mainmenu { position: relative; } #mainmenu ul { margin: 0; padding: 0; } #mainmenu li { display: inline-block; } #mainmenu a { display: block; width: 100px; padding: 10px; border: 1px solid; text-align: center; } /*sub-topics*/ #subtopics { position: absolute; display: none; margin-top: 10px; width: 100%; left: 0; } #maintopics.show #subtopics { display: block; } #subtopics ul { margin: 0; padding: 0; } #subtopics li { display: block; } #subTopics a { text-align: left; } /*columns*/ #column1, #column2, #column3 { position: relative; float: left; left: 125px; margin: 0px 5px 0px 0px; } /*hover underline*/ #mainmenu li:hover { text-decoration: underline; } /*slideshow*/ #slideshow { position: relative; width: 100%; height: 100%; } #slide1 { background-image: url(https://preview.ibb.co/mV3TR7/1.jpg); } #slide2 { background-image: url(https://preview.ibb.co/bSCBeS/2.jpg); } #slide3 { background-image: url(https://preview.ibb.co/kgG9Yn/3.jpg); } .slide { background-repeat: no-repeat; background-position: center; background-size: 800px 400px; width: 800px; height: 400px; margin: auto; margin-top: 40px; } .slide-contain { position: absolute; left: 50%; bottom: 50%; transform: translate3d(-50%,-50%,0); text-align: center; } .slide-contain span { color: white; } /*arrow*/ .arrow { position: absolute; cursor: pointer; top: 200px; width: 0; height: 0; border-style: solid; } .arrow:hover { background-color: #e0dede; transition: background-color 0.6s ease; } #arrow-left { position: absolute; border-width: 30px 40px 30px 0px; border-color: transparent gray transparent transparent; left: 0; margin-left: 300px; } #arrow-right { border-width: 30px 0px 30px 40px; border-color: transparent transparent transparent gray; right: 0; margin-right: 300px; } /*bullets*/ #slidebullet { position: relative; top: -30px; text-align: center; } .bullets { display: inline-block; background-color: gray; width: 15px; height: 15px; border-radius: 10px; cursor: pointer; transition: background-color 0.6s ease; } .clicked { background-color: #ff0000; } 
 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <link rel="stylesheet" type="text/css" href="index.css" /> </head> <body> <header></header> <nav> <div id="mainmenu"> <ul> <li><a href="">Logo</a></li> <li><a href="">Home</a></li> <li id="maintopics"><a href="">Topics</a> <div id="subtopics"> <div id="column1" class="columns"> <ul> <li><a href="">example1</a></li> <li><a href="">example2</a></li> </ul> </div> </div> </li> </ul> </div> </nav> <div id="slideshow"> <div id="slide1" class="slide"> <div class="slide-contain"> <span>Image One</span> </div> </div> <div id="slide2" class="slide"> <div class="slide-contain"> <span>Image Two</span> </div> </div> <div id="slide3" class="slide"> <div class="slide-contain"> <span>Image Three</span> </div> </div> <div id="slidebullet"> <div id="bullet1" class="bullets"></div> <div id="bullet2" class="bullets"></div> <div id="bullet3" class="bullets"></div> </div> <div id="arrow-left" class="arrow"></div> <div id="arrow-right" class="arrow"></div> </div> <script src="jquery.js"></script> <script src="index.js"></script> <script> </script> </body> </html> 

事實是,單擊mainTopics時您隱藏了documment

當您觸發click此處arrow-right時,將click documentrightSide.click(); (與其他所有內容一樣, arrow-right是文檔的一部分。)

這會觸發document上的click事件,因此會hides mainTopics

一種解決方案是在document click事件中使用event.target ,並使其不成為arrow-right元素(如果需要,也可以不是left-arrow ,很容易修改)

  if (e.target.id != 'arrow-right') {
    mainTopics.classList.remove("show");
  }

附帶說明:根據您的條件,您可以使用2種不同的方式編寫此if statement

e.target.id != 'arrow-right' && mainTopics.classList.remove("show")

要么

e.target.id != 'arrow-right' ? mainTopics.classList.remove("show") : ""

請參見下面的代碼段。 讓我知道它是否有效。

 var slideShow = (function () { var slideImages = document.getElementsByClassName("slide"); var leftSide = document.getElementById("arrow-left"); var rightSide = document.getElementById("arrow-right"); var slideBullets = document.getElementsByClassName("bullets"); var current = 0; function reset() { for (let i = 0; i < slideImages.length; i++) { slideImages[i].style.display = 'none'; slideBullets[i].classList.remove("clicked"); } }; function showImages() { for (let i = 0; i < slideImages.length; i++) { slideImages[0].style.display = 'block'; slideBullets[current].classList.add("clicked"); } }; function arrowSlide() { leftSide.addEventListener("click", function () { reset(); if (current === 0) { current = slideImages.length; } slideImages[current - 1].style.display = 'block'; current--; slideBullets[current].classList.add("clicked"); }); rightSide.addEventListener("click", function () { reset(); if (current === slideImages.length - 1) { current = - 1; } slideImages[current + 1].style.display = 'block'; current++; slideBullets[current].classList.add("clicked"); }); }; function showBulletsImages() { for (let i = 0; i < slideBullets.length; i++) { slideBullets[i].addEventListener("click", function () { reset(); slideImages[i].style.display = 'block'; slideBullets[i].classList.add("clicked"); current = i; }); } }; function autoSlide() { setInterval(function () { rightSide.click(); slideBullets[current].classList.add('clicked') }, 2000); }; return { reset: reset(), showImages: showImages(), arrowSlide: arrowSlide(), showBulletsImages: showBulletsImages(), autoSlide: autoSlide() }; })(); var toggleMenu = (function () { var mainTopics = document.getElementById("maintopics"); mainTopics.addEventListener("click", function (e) { e.preventDefault(); e.stopImmediatePropagation(); mainTopics.classList.toggle("show"); }); document.addEventListener("click", function (e) { if (e.target.id != 'arrow-right') { mainTopics.classList.remove("show"); } }); return { toggleMenu: toggleMenu() }; })(); 
 body { margin: 0; } li, a{ text-decoration: none; list-style-type: none; text-decoration-line: none; color: black; } /*main-menu*/ #mainmenu { position: relative; } #mainmenu ul { margin: 0; padding: 0; } #mainmenu li { display: inline-block; } #mainmenu a { display: block; width: 100px; padding: 10px; border: 1px solid; text-align: center; } /*sub-topics*/ #subtopics { position: absolute; display: none; margin-top: 10px; width: 100%; left: 0; } #maintopics.show #subtopics { display: block; } #subtopics ul { margin: 0; padding: 0; } #subtopics li { display: block; } #subTopics a { text-align: left; } /*columns*/ #column1, #column2, #column3 { position: relative; float: left; left: 125px; margin: 0px 5px 0px 0px; } /*hover underline*/ #mainmenu li:hover { text-decoration: underline; } /*slideshow*/ #slideshow { position: relative; width: 100%; height: 100%; } #slide1 { background-image: url(https://preview.ibb.co/mV3TR7/1.jpg); } #slide2 { background-image: url(https://preview.ibb.co/bSCBeS/2.jpg); } #slide3 { background-image: url(https://preview.ibb.co/kgG9Yn/3.jpg); } .slide { background-repeat: no-repeat; background-position: center; background-size: 800px 400px; width: 800px; height: 400px; margin: auto; margin-top: 40px; } .slide-contain { position: absolute; left: 50%; bottom: 50%; transform: translate3d(-50%,-50%,0); text-align: center; } .slide-contain span { color: white; } /*arrow*/ .arrow { position: absolute; cursor: pointer; top: 200px; width: 0; height: 0; border-style: solid; } .arrow:hover { background-color: #e0dede; transition: background-color 0.6s ease; } #arrow-left { position: absolute; border-width: 30px 40px 30px 0px; border-color: transparent gray transparent transparent; left: 0; margin-left: 300px; } #arrow-right { border-width: 30px 0px 30px 40px; border-color: transparent transparent transparent gray; right: 0; margin-right: 300px; } /*bullets*/ #slidebullet { position: relative; top: -30px; text-align: center; } .bullets { display: inline-block; background-color: gray; width: 15px; height: 15px; border-radius: 10px; cursor: pointer; transition: background-color 0.6s ease; } .clicked { background-color: #ff0000; } 
 <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <link rel="stylesheet" type="text/css" href="index.css" /> </head> <body> <header></header> <nav> <div id="mainmenu"> <ul> <li><a href="">Logo</a></li> <li><a href="">Home</a></li> <li id="maintopics"><a href="">Topics</a> <div id="subtopics"> <div id="column1" class="columns"> <ul> <li><a href="">example1</a></li> <li><a href="">example2</a></li> </ul> </div> </div> </li> </ul> </div> </nav> <div id="slideshow"> <div id="slide1" class="slide"> <div class="slide-contain"> <span>Image One</span> </div> </div> <div id="slide2" class="slide"> <div class="slide-contain"> <span>Image Two</span> </div> </div> <div id="slide3" class="slide"> <div class="slide-contain"> <span>Image Three</span> </div> </div> <div id="slidebullet"> <div id="bullet1" class="bullets"></div> <div id="bullet2" class="bullets"></div> <div id="bullet3" class="bullets"></div> </div> <div id="arrow-left" class="arrow"></div> <div id="arrow-right" class="arrow"></div> </div> <script src="jquery.js"></script> <script src="index.js"></script> <script> </script> </body> </html> 

對於mainTopics您已經在兩個DOM元素上附加了click事件。

  1. 主要議題
  2. 文獻

單擊時,由於mainTopics DOM click事件而添加了show

由於event bubblingdocument捕獲刪除show類的click事件。

因此,同時添加和刪除了show類。

mainTopics.addEventListener("click", function (e) {
        e.preventDefault();
        e.stopImmediatePropagation();
        mainTopics.classList.toggle("show");
    });

    document.addEventListener("click", function () {
        mainTopics.classList.remove("show");
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM