最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Mobile Video PlayPause Toggle Not Working Reliably (SwiperJS Slider) - Stack Overflow

programmeradmin3浏览0评论

I'm using Swiper JS to create a slider of TikTok videos on my website. I've implemented a feature where users can click on the video itself to toggle between play and pause. This works perfectly on desktop browsers. However, on mobile devices, the play/pause toggle is unreliable. It doesn't work. It seems like the video element's play() and pause() methods are not being triggered on mobile.

document.addEventListener('DOMContentLoaded', function() {
    const swiper_video = new Swiper('.tiktok-carousel', {
        loop: true, // Enable infinite loop
                slidesPerView: "auto", // or number for fixed slides
                spaceBetween: 10, // Space between slides
                centeredSlides: true, // Center the active slide
                pagination: {
                    el: ".swiper-pagination",
                    clickable: true,
                },
                navigation: {
                    enabled: false,
                    nextEl: ".swiper-button-next",
                    prevEl: ".swiper-button-prev",
                },
                breakpoints: {
                    769: {
            navigation: {
              enabled: true
            },
                        slidesPerView: 2,
                    },
           1100: {
            navigation: {
              enabled: true
            },
                        slidesPerView: 2,
                        centeredSlides: true,
                   },
    });

    swiper_video.on('init', () => {
        const videos = document.querySelectorAll('.tiktok-embed');
        videos.forEach(video => {
            let isManuallyPaused = false;
            let touchTimeout;

            video.addEventListener('touchstart', function(event) {
                event.preventDefault();
                clearTimeout(touchTimeout);

                touchTimeout = setTimeout(() => {
                    togglePlayPause(video);
                }, 200);

            });

            video.addEventListener('click', function(event) {
                event.stopPropagation();
                togglePlayPause(video);
            });

            video.addEventListener('play', function() {
                isManuallyPaused = false;
            });

            video.addEventListener('pause', function() {
                if (!isManuallyPaused) {
                    video.play();
                }
            });

            function togglePlayPause(video) {
                if (video.paused) {
                    video.play();
                    isManuallyPaused = false;
                } else {
                    video.pause();
                    isManuallyPaused = true;
                }
            }
        });
    });

    swiper_video.on('transitionEnd', () => {
        const videos = document.querySelectorAll('.tiktok-embed');
        videos.forEach(video => {
            video.pause();
        });
    });
});

What I've tried:

  • Using event.stopPropagation() in the click handler.
  • Using both touchstart and click event listeners.
  • Implementing the isManuallyPaused flag.
  • Using setTimeout to introduce a delay.
  • Ensuring event listeners are attached after Swiper initialization.

This issue only persists on mobile phone browsers. I suspect it might be related to how mobile browsers handle touch events and video playback. I need a solution that works consistently on both desktop and mobile.

发布评论

评论列表(0)

  1. 暂无评论