javascript - 在同一页面上的多个画廊上使用幻灯片功能
问题描述
我在一个页面上有多个具有相同课程的画廊。我添加了一个滑块JavaScript function
。它可以工作,但是如果我关闭灯箱(当前滑块)并打开另一个灯箱,它会从上一个幻灯片索引开始,滑块更改更快并且出现控制台错误:Uncaught TypeError: document.querySelector(...) is null
这是简化的 JS 代码:
var slideNum = 0;
var slides;
function showSlides() {
var i;
slides = document.querySelector("#Images").childNodes;
for (i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
slideNum++;
if (slideNum> slides.length) {slideNum = 1}
slides[slideNum-1].style.display = "block";
setTimeout(showSlides, 3000);
}
有没有办法停止并在另一个画廊上function
启动它?onclick
解决方案
也许以下内容可能会有所帮助。它使用从主函数中调用的自执行匿名函数来返回当前slideNum
变量......当加载新画廊时,该变量仍然存在。我很欣赏,这可能与您的画廊设置不太相似,但毫无疑问可以进行调整。
var pause=10;
var slideNum = 0;
var slides;
var tx=NaN;
const clearslides=function( id ){
document.querySelectorAll('.ss > img').forEach( img=>{
img.style.display='none';
})
slides=document.querySelectorAll('#'+id+' > img');
return slides;
}
const showSlides=function( id ){
slideNum--; // so that when next slideshow is invoked the index does not increment up
console.clear();
console.info( 'New Slideshow:%s, Index:%d', id, slideNum );
if( !isNaN( tx ) )clearTimeout( tx );
slides=clearslides( id );
slideNum=function(){
if( slideNum < 0 || slideNum >= slides.length )slideNum=0;
clearslides( id );
slides[ slideNum ].style.display='block';
console.info( 'Gallery:%s, Index:%d - Title:%s', id, slideNum, slides[ slideNum ].title );
tx=setTimeout( arguments.callee, 1000 * pause );
slideNum++;
return slideNum;
}();
};
div.ss{margin:1rem auto;}
div > img{display:none}
img{width:300px;height:200px}
a{text-decoration:none;font-family:monospace;}
a:hover{text-decoration:underline;color:red}
a:after{content:'|';margin:0 1rem;}
a:last-of-type:after{content:none}
<a href='#' onclick=showSlides('images-1')>Gallery-1</a>
<a href='#' onclick=showSlides('images-2')>Gallery-2</a>
<a href='#' onclick=showSlides('images-3')>Gallery-3</a>
<div class='ss' id='images-1'>
<img src='//picsum.photos/300/200?random=1' title='gallery:1 slide:0' />
<img src='//picsum.photos/300/200?random=2' title='gallery:1 slide:1' />
<img src='//picsum.photos/300/200?random=3' title='gallery:1 slide:2' />
</div>
<div class='ss' id='images-2'>
<img src='//picsum.photos/300/200?random=4' title='gallery:2 slide:0' />
<img src='//picsum.photos/300/200?random=5' title='gallery:2 slide:1' />
<img src='//picsum.photos/300/200?random=6' title='gallery:2 slide:2' />
</div>
<div class='ss' id='images-3'>
<img src='//picsum.photos/300/200?random=7' title='gallery:3 slide:0' />
<img src='//picsum.photos/300/200?random=8' title='gallery:3 slide:1' />
<img src='//picsum.photos/300/200?random=9' title='gallery:3 slide:2' />
</div>
推荐阅读
- java - Java – 带有构造函数和方法的二维数组
- c# - 无法加载字体
- java - 如何使用 auto-value-gson 映射未知的 json 字段
- prolog - 在 prolog 中定义谓词
- objective-c - 在 Objective-C 中如何以毫秒获取 NSDate?dateFromString:方法忽略毫秒
- amazon-web-services - 为 ECR 中的所有存储库设置一个生命周期策略
- ios - 当添加到另一个对象中时,对象中的双精度会转换为字符串
- html - Angularjs html标签显示而不是渲染
- c# - WPF TreeView 上的类型
- html - 将图像与文本块配对