javascript - Javascript迭代显示带有暂停/停止jquery fadeIn和fadeOut的自定义列表
问题描述
我有一个不断更新的数组,需要一次显示数组 5 中的项目。有时数组中的元素超过 5 个,有时则更少。如果数组中有超过 5 个元素,那么我需要一次循环 5 个。例如,如果有 10 个元素,我想淡入 1-5,然后淡出 1-5,然后淡入 5-10。我有这个工作,并且正在更新,但是,如果在数据更新后只有 4 篇新闻文章可用,它仍然会一遍又一遍地淡入淡出 1-4。我需要总是在第一篇文章中淡出,如果少于 numberToShow,不要淡出,只需更新。
我试过 clearInterval,但它停止更新。我试过 .stop().fadeOut(); 但随后淡入不断发生。我试过 .stop().fadeOut(); 使用 .stop().fadeIn(); 但数据永远不会淡入。我应该将数组传入以显示它,然后在那里循环吗?
为了测试,这是使用日期模拟的。每 8 秒它应该使用更新的数字更新数据。如果有 4 篇文章,淡入并更新 Date.now() 编号,但永远不要淡出。如果有 10 篇文章,则淡入并更新每个周期。
var numberToShow = 5;
var newsArray = [];
var startRow = 0;
var endRow = 0;
function getData() {
// Simulate the data changing using date.
newsArray = [Date.now(), "News article 1", "News article 2", "News article 3", "News article 4",
"News article 5", "News article 6", "News article 7", "News article 8", "News article 9"];
showNews(numberToShow);
}
// Fade out the results for the next cycle
setInterval(function() {
$("span.text").fadeOut({
duration: 800
});
setTimeout(
function() {
getData();
},
(800)
);
}, 8000);
// Update the data
function updateData() {
getData();
setTimeout(updateData, 6000);
}
// Display the results
function showNews() {
if (endRow >= newsArray.length) {
startRow = 0;
}
endRow = startRow + numberToShow;
if (endRow >= newsArray.length) {
endRow = newsArray.length;
}
var results = "";
for (var k = startRow; k < endRow; k++) {
results += "<span class='text' style='display:none;'>" + newsArray[k] + "</span><br>";
}
startRow = startRow + numberToShow;
document.getElementById('showResults').innerHTML = results;
$("span.text").fadeIn({
duration: 800
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="showResults"></div>
解决方案
虽然以前的答案很好 - 这个可能更像你描述中的情况......这个想法的简短描述:
- 显示列表或其中的一部分。
- 如果列表更长 - 重复(几秒钟后转到步骤 1 以显示列表的另一部分)
- 当更新到来时 - 随时 - 从新数组重新开始
和工作示例(删除不需要的代码并添加按钮以帮助测试):
var
numberToShow = 5,
newsArray = [],
startRow = 0,
endRow = 0,
$results = $("#showResults"),
timer;
function getData() {
// Simulate the data changing
newsArray = [Date.now()];
// add random number of items
var j = Math.floor(Math.random()*7)+1;
for(var i=0; i<j; i++){
newsArray.push('News article '+i);
}
// add one more item named "last"
newsArray.push('Last News article');
startCycle();
}
function startCycle() {
startRow = 0;
endRow = 0;
$results.fadeOut(800, function(){
renderList();
});
}
function renderList() {
if (endRow >= newsArray.length) {
startRow = 0;
}
endRow = startRow + numberToShow;
if (endRow > newsArray.length) {
endRow = newsArray.length;
}
var results = "";
for (var k = startRow; k < endRow; k++) {
results += "<span class='text'>" + newsArray[k] + "</span><br>";
}
startRow = startRow + numberToShow;
$results.html(results);
$results.fadeIn(800, function(){
nextCycle();
});
}
function nextCycle() {
// start cycling only if there is more results to be shown
if(newsArray.length > numberToShow){
timer = setTimeout(function(){
$results.fadeOut(800, function(){
renderList();
});
}, 4000);
}
}
// update on request
function updateData() {
clearTimeout(timer);
$results.stop();
getData();
}
// add button for tests
$results.before(
$('<button/>').text('Update now').click(function(){
updateData();
})
)
getData();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="showResults"></div>
推荐阅读
- phpstorm - 如何设置自动保存 PhpStorm?
- .net - .net 应用程序 XHR sql 请求在 30 秒后超时
- unit-testing - 在不同包的测试文件之间共享数据
- html - 将子元素放在兄弟元素之上
- react-native - 使用 React Native 构建可在 Android 和 Windows 10 平台上运行的应用程序
- angularjs - 成功注销后,keycloak 会话未终止
- jquery - 如何使用 jQuery 更改 data-rules-required 的值
- vim - 如何在 Vim 中更改部分变量/函数名
- xslt - 我们如何在 XSLT 中将一个元素称为另一个元素?
- sql - 如何解决 schema_of_json 的这个 sql 错误