javascript - Swiper 观察者随机延迟

标签 javascript slideshow mutation-observers swiper.js

我正在使用 Swiper 构建一个带有 slider 功能的缩略图库。 (v6.5.1)。默认情况下, slider 是隐藏的,当用户单击其中一张图像时, slider 必须显示为显示单击的图像。 slider 打开后,用户可以单击关闭按钮将其隐藏并返回缩略图库。
这是我正在使用的代码:
JS:

var swiper;

swiper = new Swiper( '.gallery-slider .swiper-container', {
    loop: true,
    observer: true,
    observeParents: true,
    autoplay: {
        delay: 3000,
        disableOnInteraction: false,
    },
    navigation: {
        nextEl: '.swiper-next',
        prevEl: '.swiper-prev',
    },
});

document.querySelectorAll( '.gallery-thumbnails a[data-slide]' ).forEach( item => {
    item.addEventListener( 'click', function( e ) {
        e.preventDefault();
        window.scrollTo( 0, 0 );
        document.querySelector( '.gallery-thumbnails' ).style.display = 'none';
        document.querySelector( '.gallery-slider .swiper-container' ).style.display = 'block';
        var slideno = $( this ).data( 'slide' );
        swiper.slideTo( slideno + 1, false, false );
    });
});

document.querySelector( '.gallery-slider .close' ).addEventListener( 'click', function( e ) {
    e.preventDefault();
    document.querySelector( '.gallery-slider .swiper-container' ).style.display = 'none';
    document.querySelector( '.gallery-thumbnails' ).style.display = 'flex';
});
CSS:
.gallery-slider .swiper-container {
    display: none;
}
HTML:
<div class="gallery-thumbnails">
    <div class="gallery-image"><a href="" data-slide="0"><img src="thumb0.jpg" /></a></div>
    <div class="gallery-image"><a href="" data-slide="1"><img src="thumb1.jpg" /></a></div>
    <div class="gallery-image"><a href="" data-slide="2"><img src="thumb2.jpg" /></a></div>
    <div class="gallery-image"><a href="" data-slide="3"><img src="thumb3.jpg" /></a></div>
    ....
</div>

<div class="gallery-slider">
    <div class="swiper-container">
        <div class="swiper-prev">previous</div>
        <div class="swiper-next">next</div>
        <div class="close">close</div>
        <div class="swiper-wrapper">
            <div class="swiper-slide"><img src="slide0.jpg" /></div>
            <div class="swiper-slide"><img src="slide1.jpg" /></div>
            <div class="swiper-slide"><img src="slide2.jpg" /></div>
            <div class="swiper-slide"><img src="slide3.jpg" /></div>
            ....
        </div>
    </div>
</div>
如您所见,代码使用了 Swiper 的观察者功能,每次 Swiper 的样式(如隐藏/显示)或其子元素(如添加/删除幻灯片)发生变化时,它都会重新初始化 Swiper。
当我第一次单击缩略图库中的图像时,一切都按预期工作。但是,如果我使用关闭按钮隐藏 slider ,然后单击新图像以再次打开 slider , slider 会出现,但直到几秒钟过去后才会响应。奇怪的是,这种延迟并不总是一样的。有时几乎是瞬时的,有时当 slider 开始响应下一个和上一个按钮中的点击时,已经过了 x 秒以上。我注意到的一件事是,如果我调整窗口大小, slider 会立即响应。
我在最新的 Chrome 和 Firefox 中尝试了这段代码,结果相同。
这是预期的行为吗?是MutationObserver观察者功能使用的不是总是监听 DOM 的变化吗?我是否以错误的方式初始化 Swiper?
这是 Swiper 观察者的代码:
https://github.com/nolimits4web/swiper/blob/master/src/modules/observer/observer.js

最佳答案

我找到了奇怪延迟的罪魁祸首。我在 slideTo 中传递了一个 bool 值作为第二个参数。函数而不是整数,这是它的正确类型。
您必须更改该行:swiper.slideTo( slideno + 1, false, false );至:swiper.slideTo( slideno + 1, 0, false );

关于javascript - Swiper 观察者随机延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66866709/

相关文章:

javascript - Node.js UnhandledPromiseRejectionWarning 即使在捕获它之后

Javascript/DOM : How to remove all event listeners of a DOM object?

javascript - 在几个字符之一的第一个实例之后删除所有内容

javascript - 使用 bxslider 的高级字幕

javascript - 简单的 jQuery 幻灯片脚本?

javascript - 通过 chrome devtools 添加/删除节点时观察 DOM 突变

javascript - 如何在 Rails 中制作动态下拉菜单?

javascript - 使用 Mutation Observer 动态向元素添加或删除类

jquery - 在动态创建的元素上附加 javascript/jquery 事件

javascript - jQuery kwicks。 Li 不展开(调整大小)