Вы можете использовать немного другой подход к событию нажатия кнопки, опустошив и восстановив список <ul>
в случае нажатия кнопки.
Что вам также нужно помнить, это то, что ваши тайм-ауты должны быть отменены при нажатии кнопки. Чтобы достичь этого, вы можете подумать о сохранении идентификатора каждого тайм-аута, чтобы каждый тайм-аут мог быть очищен при нажатии кнопки.
Следующий код является одним из подходов к этому, который минимизирует количество корректировок вашего текущего кода:
var duration = 500;
// Declare timeout array to store timeout ids
var timeouts = [];
for(let i=0; i < 20; i++ ){
// Store each timeout id, so that you can cancel them if
// button clicked
timeouts[i] = setTimeout(function(){
$('ul').append('<li>'+ (i+1) +'</li>')
}, i * duration);
}
$('button').click(function(){
// If button clicked, empty ul and repopulate it
$('ul').empty()
for(var i = 0; i < timeouts.length; i++) {
// Clear timeout at i
clearTimeout(timeouts[i])
// Add li element for i
$('ul').append('<li>'+ (i+1) +'</li>')
}
duration = 0;
});
ul li{
list-style-type: none;
float:left;
width: 20px;
color: #FFF;
text-align: center;
}
ul li:nth-child(even){
background-color: #222;
}
ul li:nth-child(odd){
background-color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul></ul>
<br>
<button>display all</button>