简体   繁体   English

setTimeout 在事件侦听器中不起作用

[英]setTimeout does not work inside eventlistener

I am trying to code a slider which should fade in an image if I click on a button.我正在尝试编写一个滑块,如果我点击一个按钮,它应该在图像中淡入淡出。

 function showelementOnclick(selectorToID, firstShowingElenment, milliseconds) { var childElements = $(selectorToID).children(); var a = childElements.find("button"); for (var i = 0; i < a.length; i += 2) { a.eq(i).click(function() { childElements.eq(firstShowingElenment).css("display", "none"); firstShowingElenment--; console.log("first : " + firstShowingElenment) if (firstShowingElenment == -1) { firstShowingElenment = 2; } childElements.eq(firstShowingElenment).fadeIn(1000) console.log("Bin ich hier?") setTimeout(function() { console.log("hi") }, 5000) }) } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="slider"> <div class="slide first"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 1</button> <button>Vorwärts 1</button> </div> <div class="slide second"> <img src="Bilder/image.jpg" alt="" />--> <button>Rückwärts 2</button> <button>Vorwärts 2</button> </div> <div class="slide third"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 3</button> <button>Vorwärts 3</button> </div> </div>

This is my code, the fade in functionality does work, but setTimeout does not work properly.这是我的代码,淡入功能确实有效,但setTimeout无法正常工作。 My goal is that, if a user clicks on the button that should display an image and if he wants to click twice he has to wait 5 seconds.我的目标是,如果用户点击应该显示图像的按钮,如果他想点击两次,他必须等待 5 秒钟。 Sorry for my bad english.对不起,我的英语不好。

I replaced the JavaScript you provided with an alternative solution that I think should work for the functionality you described.我用我认为应该适用于您描述的功能的替代解决方案替换了您提供的 JavaScript。

You can wrap the setTimeout in a Promise constructor and await it's completion.您可以将setTimeout包装在Promise构造函数中并await它完成。 Simply disable the button prior to calling setTimeout and re-enable it once the timeout is done.只需在调用setTimeout之前禁用该按钮,并在超时完成后重新启用它。

Using event delegation is a simpler way to handle event management than looping over each and every button element.使用事件委托是一种比循环遍历每个button元素更简单的事件管理方式。 The basic idea is to have a single event listener placed on the parent element in the DOM hierarchy and then inspect the event argument passed to the handler when the event occurs.基本思想是在 DOM 层次结构中的父元素上放置一个事件侦听器,然后在事件发生时检查传递给处理程序的event参数。 This keeps code cleaner that having a unique handler setup for each and every button on the page.这使代码更清晰,为页面上的每个button设置一个唯一的处理程序。 Below is an example:下面是一个例子:

 const sliderEl = document.querySelector('#slider'); const TIMEOUT_DURATION = 5000; sliderEl.addEventListener('click', async event => { if (event.target.tagName === 'BUTTON') { event.target.disabled = true; await new Promise((resolve, reject) => { setTimeout(resolve, TIMEOUT_DURATION); }); event.target.disabled = false; } });
 <div id="slider"> <div class="slide first"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 1</button> <button>Vorwärts 1</button> </div> <div class="slide second"> <img src="Bilder/image.jpg" alt="" />--> <button>Rückwärts 2</button> <button>Vorwärts 2</button> </div> <div class="slide third"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 3</button> <button>Vorwärts 3</button> </div> </div>

If this isn't what you're trying to achieve, I can re-read the question and amend my answer.如果这不是您想要实现的目标,我可以重新阅读问题并修改我的答案。

This should work on IE without having to use polyfills:这应该适用于 IE,而无需使用 polyfill:

 const sliderEl = document.querySelector('#slider'); const TIMEOUT_DURATION = 5000; sliderEl.addEventListener('click', function(event) { if (event.target.tagName === 'BUTTON') { event.target.disabled = true; setTimeout(function() { event.target.disabled = false; }, TIMEOUT_DURATION); } });
 <div id="slider"> <div class="slide first"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 1</button> <button>Vorwärts 1</button> </div> <div class="slide second"> <img src="Bilder/image.jpg" alt="" />--> <button>Rückwärts 2</button> <button>Vorwärts 2</button> </div> <div class="slide third"> <img src="Bilder/Download.jpg" alt="" />--> <button>Rückwärts 3</button> <button>Vorwärts 3</button> </div> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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