Swiper Autoplay Mouse Events

User
if(jQuery('.swiperslides').length)
{
var swiper = new Swiper(".swiperslides", {
slidesPerView:3,
spaceBetween: 30,
loop: true, // Enable infinite looping
autoplay: {
delay: 1,
disableOnInteraction: false,
},
pagination: false,
speed: 4000,
breakpoints: {
0: {
slidesPerView: 1.2,
spaceBetween: 10,
},
1024: {
slidesPerView: 3,
spaceBetween: 30,
}
}
});

// Add event listeners for mouse interactions
swiper.slides.forEach((slide) => {
slide.addEventListener("mouseenter", () => {

swiper.wrapperEl.style.transitionDuration = "0ms";
swiper.wrapperEl.style.transitionDelay = "0ms";
swiper.autoplay.stop(); // Stop autoplay immediately

console.log("call");

});

slide.addEventListener("mouseleave", () => {

swiper.autoplay.start(); // Restart autoplay

// Restore transition-duration on swiper-wrapper
swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value

});
});

}
Uncaught TypeError: Cannot read properties of undefined (reading 'forEac

Assistant
The error message you're encountering, `Uncaught TypeError: Cannot read properties of undefined (reading 'forEach')`, suggests that the `swiper.slides` property is not defined at the time you're trying to access it. This can happen if the Swiper instance has not been initialized properly or if the slides have not been rendered yet.

To resolve this issue, you can try the following steps:

1. **Check Swiper Initialization:** Ensure that the Swiper instance is initialized correctly and that there are slides available before accessing the `swiper.slides` property.

2. **Use `swiper.on` for Events:** Instead of manually adding event listeners to each slide, you can use Swiper's built-in event listeners for mouse events. Swiper provides events like `mouseenter` and `mouseleave`, which you can use directly.

3. **Ensure Slides are Rendered:** If you are dynamically adding slides or if they take time to load, make sure that the slides are rendered before accessing them.

Here’s an updated version of your code that incorporates these suggestions:

if (jQuery('.swiperslides').length) {
    var swiper = new Swiper(".swiperslides", {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true, // Enable infinite looping
        autoplay: {
            delay: 1,
            disableOnInteraction: false,
        },
        pagination: false,
        speed: 4000,
        breakpoints: {
            0: {
                slidesPerView: 1.2,
                spaceBetween: 10,
            },
            1024: {
                slidesPerView: 3,
                spaceBetween: 30,
            }
        }
    });

    // Use Swiper's built-in event listeners
    swiper.on('mouseenter', function () {
        swiper.wrapperEl.style.transitionDuration = "0ms";
        swiper.wrapperEl.style.transitionDelay = "0ms";
        swiper.autoplay.stop(); // Stop autoplay immediately
        console.log("Mouse entered");
    });

    swiper.on('mouseleave', function () {
        swiper.autoplay.start(); // Restart autoplay
        // Restore transition-duration on swiper-wrapper
        swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value
    });
}

### Key Changes:
– **Removed `forEach` loop**: Instead of using `forEach` on `swiper.slides`, we used `swiper.on` to add the mouse event listeners directly to the Swiper instance.
– **Event handling directly on Swiper**: This method ensures that you’re correctly using Swiper's API for handling events.

Try this updated code, and it should fix the error you're encountering.

User
swiper-custom.js?ver=1737357649:27 Uncaught TypeError: swiper.on is not a function
Assistant
The error `Uncaught TypeError: swiper.on is not a function` indicates that the method `on` is not available on the Swiper instance. This is likely due to the version of Swiper you're using or a misunderstanding of the available API methods.

Here’s a more robust approach to adding mouse event listeners without relying on the `on` method, which might not exist in the version you're using. Instead, you can still use standard JavaScript event listeners.

Here’s the updated code:

if (jQuery('.swiperslides').length) {
    var swiper = new Swiper(".swiperslides", {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true, // Enable infinite looping
        autoplay: {
            delay: 1,
            disableOnInteraction: false,
        },
        pagination: false,
        speed: 4000,
        breakpoints: {
            0: {
                slidesPerView: 1.2,
                spaceBetween: 10,
            },
            1024: {
                slidesPerView: 3,
                spaceBetween: 30,
            }
        }
    });

    // Ensure that slides are initialized and available
    swiper.on('init', function () {
        // Add event listeners for mouse interactions
        swiper.slides.forEach((slide) => {
            slide.addEventListener("mouseenter", () => {
                swiper.wrapperEl.style.transitionDuration = "0ms";
                swiper.wrapperEl.style.transitionDelay = "0ms";
                swiper.autoplay.stop(); // Stop autoplay immediately
                console.log("Mouse entered");
            });

            slide.addEventListener("mouseleave", () => {
                swiper.autoplay.start(); // Restart autoplay
                // Restore transition-duration on swiper-wrapper
                swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value
            });
        });
    });

    // Initialize Swiper
    swiper.init();
}

### Key Changes:
– **Initialization Check**: The event listeners are now added within the `swiper.on('init', …)` callback, ensuring that the slides are available when the listeners are attached.
– **Manual `swiper.init()` Call**: Although calling `swiper.init()` manually is not usually needed as it initializes automatically, this ensures that we capture the `init` event if Swiper is set to initialize later.

If the problem persists, please check your Swiper version. In Swiper 6 and above, the `on` method is a standard part of the API. You might want to refer to the [Swiper documentation](https://swiperjs.com/) for the version you are using to see the correct methods available.

Make sure you include the appropriate Swiper CSS and JS files in your project, as this can also lead to unexpected behavior if the scripts are not correctly linked.

User
swiper-custom.js?ver=1737357649:27 Uncaught TypeError: swiper.on is not a function
Assistant
The error you're encountering, `Uncaught TypeError: swiper.on is not a function`, suggests that you're likely using a version of Swiper that does not support the `on` method as part of its API, or that the Swiper instance isn't being created correctly.

### Steps to Fix the Issue

1. **Check Swiper Version**: Ensure you are using a compatible version of Swiper (6.0.0 or higher) where the `on` method is available. You can do this by checking the version in your `package.json` or in the CDN link you're using.

2. **Correct Event Listener Attachment**: Instead of relying on the `on` method, we will use standard JavaScript event listeners. Here’s how you can properly implement mouse enter and leave events without using the `on` method:

### Updated Code

if (jQuery('.swiperslides').length) {
    var swiper = new Swiper(".swiperslides", {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true, // Enable infinite looping
        autoplay: {
            delay: 1,
            disableOnInteraction: false,
        },
        pagination: false,
        speed: 4000,
        breakpoints: {
            0: {
                slidesPerView: 1.2,
                spaceBetween: 10,
            },
            1024: {
                slidesPerView: 3,
                spaceBetween: 30,
            }
        }
    });

    // Use a timeout to ensure slides are rendered
    setTimeout(() => {
        // Add event listeners for mouse interactions
        swiper.slides.forEach((slide) => {
            slide.addEventListener("mouseenter", () => {
                swiper.wrapperEl.style.transitionDuration = "0ms";
                swiper.wrapperEl.style.transitionDelay = "0ms";
                swiper.autoplay.stop(); // Stop autoplay immediately
                console.log("Mouse entered");
            });

            slide.addEventListener("mouseleave", () => {
                swiper.autoplay.start(); // Restart autoplay
                // Restore transition-duration on swiper-wrapper
                swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value
            });
        });
    }, 100); // Delay added to ensure slides are ready
}

### Key Changes:
– **Using `setTimeout`**: This is used to wait a moment before attaching the mouse event listeners to ensure that Swiper has properly rendered the slides.
– **Event Listeners**: We're directly adding the event listeners to each slide after a brief delay, ensuring that the Swiper instance is fully ready.

### Check Script Inclusion
Make sure you are including the correct Swiper library. Here’s an example of how you can include it using a CDN:

<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>

### Verify Swiper Initialization
If you continue to have issues, verify that your Swiper initialization code is being executed and that there are no JavaScript errors preventing it from running. You can add a simple log statement right after the Swiper instance creation to ensure it’s reached:

console.log('Swiper initialized:', swiper);

### If Problems Persist
If you are still facing issues, consider checking:
– The order of your script tags to ensure that jQuery is loaded before your custom script.
– No other scripts conflicting with Swiper.
– Swiper documentation for the specific version you are using for any differences in API.

Assistant
The error `swiper.on is not a function` suggests that the Swiper instance you're working with might not support the event handling methods you're trying to use. This can happen if you're using an older version of Swiper or if the instance has been created in a way that doesn't support the event system.

Here’s a step-by-step approach to resolve the issue:

1. **Check Swiper Version**: Ensure you're using Swiper 6 or above, as the event handling methods were introduced in version 6. You can check the version in your project by inspecting the Swiper JavaScript file or the documentation.

2. **Event Listeners on Slides**: If the event system is not available, you can still manually add event listeners to each slide after confirming that the slides are rendered.

3. **Initialization and Event Listener Setup**: Ensure that your code waits for the Swiper to be fully initialized before trying to access `swiper.slides`.

Here’s an alternative approach that should work regardless of the Swiper version:

### Updated Code

if (jQuery('.swiperslides').length) {
    var swiper = new Swiper(".swiperslides", {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true, // Enable infinite looping
        autoplay: {
            delay: 1,
            disableOnInteraction: false,
        },
        pagination: false,
        speed: 4000,
        breakpoints: {
            0: {
                slidesPerView: 1.2,
                spaceBetween: 10,
            },
            1024: {
                slidesPerView: 3,
                spaceBetween: 30,
            }
        }
    });

    // Wait until Swiper is initialized
    swiper.on('init', function () {
        // Add event listeners for mouse interactions
        const slides = swiper.slides; // Access the slides array

        // Ensure slides are available and not empty
        if (slides.length) {
            slides.forEach((slide) => {
                slide.addEventListener("mouseenter", () => {
                    swiper.wrapperEl.style.transitionDuration = "0ms";
                    swiper.wrapperEl.style.transitionDelay = "0ms";
                    swiper.autoplay.stop(); // Stop autoplay immediately
                    console.log("Mouse entered");
                });

                slide.addEventListener("mouseleave", () => {
                    swiper.autoplay.start(); // Restart autoplay
                    // Restore transition-duration on swiper-wrapper
                    swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value
                });
            });
        }
    });

    // Initialize Swiper
    swiper.init();
}

### Key Points:
– **Event Handling**: We're still using `swiper.on('init', …)`, which should work if your Swiper version supports it.
– **Manual Initialization**: While `swiper.init()` is called here for clarity, you typically don't need to call it explicitly, as Swiper initializes automatically when created.
– **Ensure Swiper is Fully Loaded**: The event listeners for mouse interactions are added once the `init` event is fired, ensuring that the slides exist and are accessible.

### Alternative Approach (No Events):
If you're still facing issues with the `on` method, consider directly adding event listeners without using the Swiper event system:

if (jQuery('.swiperslides').length) {
    var swiper = new Swiper(".swiperslides", {
        slidesPerView: 3,
        spaceBetween: 30,
        loop: true, // Enable infinite looping
        autoplay: {
            delay: 1,
            disableOnInteraction: false,
        },
        pagination: false,
        speed: 4000,
        breakpoints: {
            0: {
                slidesPerView: 1.2,
                spaceBetween: 10,
            },
            1024: {
                slidesPerView: 3,
                spaceBetween: 30,
            }
        }
    });

    // Add event listeners for mouse interactions after Swiper is fully initialized
    setTimeout(() => {
        const slides = swiper.slides;
        slides.forEach((slide) => {
            slide.addEventListener("mouseenter", () => {
                swiper.wrapperEl.style.transitionDuration = "0ms";
                swiper.wrapperEl.style.transitionDelay = "0ms";
                swiper.autoplay.stop(); // Stop autoplay immediately
                console.log("Mouse entered");
            });

            slide.addEventListener("mouseleave", () => {
                swiper.autoplay.start(); // Restart autoplay
                // Restore transition-duration on swiper-wrapper
                swiper.wrapperEl.style.transitionDuration = "4000ms"; // Reset to default value
            });
        });
    }, 0); // Use a timeout to ensure the slides are available
}

### Summary
If you still encounter issues, double-check the Swiper version and its documentation for your specific version. If you're using an older version, consider updating to the latest stable version of Swiper to take advantage of its full API capabilities.

Leave a Comment

Your email address will not be published. Required fields are marked *