# king-addons/51.1.65/includes/widgets/Sticky_Video/script.js

King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder, version 51.1.65. 162 lines.

- Page: https://pluginprobe.com/plugins/king-addons/51.1.65/code/includes/widgets/Sticky_Video/script.js
- Raw: https://pluginprobe.com/plugins/king-addons/51.1.65/raw/includes/widgets/Sticky_Video/script.js
- Modified: 2026-06-28T21:26:56+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/king-addons/51.1.65/code/includes/widgets/Sticky_Video/script.js#L10-L20`.

```javascript
"use strict";

(function ($) {
    const isDeviceAllowed = (device) => {
        if (device === "desktop") {
            return window.matchMedia("(min-width: 768px)").matches;
        }
        if (device === "mobile") {
            return window.matchMedia("(max-width: 767px)").matches;
        }
        return true;
    };

    const getStoredState = (key) => {
        if (!key) {
            return null;
        }

        try {
            const raw = window.localStorage.getItem(key);
            if (!raw) {
                return null;
            }
            const parsed = JSON.parse(raw);
            if (parsed.expires && parsed.expires < Date.now()) {
                window.localStorage.removeItem(key);
                return null;
            }
            return parsed.state || null;
        } catch (e) {
            return null;
        }
    };

    const setStoredState = (key, state, hours) => {
        if (!key) {
            return;
        }

        try {
            const expires =
                hours && hours > 0
                    ? Date.now() + hours * 60 * 60 * 1000
                    : null;
            const payload = {
                state,
                expires,
            };
            window.localStorage.setItem(key, JSON.stringify(payload));
        } catch (e) {
            // Ignore storage errors (private mode).
        }
    };

    const toggleVisibility = ($widget, visible) => {
        if (visible) {
            $widget.addClass("is-visible").attr("aria-hidden", "false");
        } else {
            $widget.removeClass("is-visible").attr("aria-hidden", "true");
        }
    };

    const bindClose = ($widget, data, state, evaluate) => {
        const $close = $widget.find(".king-addons-sticky-video__close");
        if (!$close.length || data.showClose !== "yes") {
            return;
        }

        $close.on("click", (event) => {
            event.preventDefault();
            state.dismissed = true;
            $widget.addClass("is-dismissed");
            toggleVisibility($widget, false);
            if (data.persistClose === "yes" && data.persistKey) {
                setStoredState(data.persistKey, "closed", data.persistHours);
            }
            evaluate();
        });
    };

    const initStickyVideo = ($scope) => {
        const $widget = $scope.find(".king-addons-sticky-video");
        if (!$widget.length) {
            return;
        }

        const data = $widget.data();
        data.triggerScroll = Number(data.triggerScroll || 0);
        data.delayMs = Number(data.delayMs || 0);
        data.persistHours = Number(data.persistHours || 0);
        data.persistKey = data.unique
            ? `kingAddonsStickyVideo_${data.unique}`
            : "";
        data.showClose = data.showClose || "yes";
        data.persistClose = data.persistClose || "no";
        data.device = data.device || "all";

        if (!isDeviceAllowed(data.device)) {
            $widget.addClass("is-dismissed");
            return;
        }

        const savedState = getStoredState(data.persistKey);
        const state = {
            dismissed: savedState === "closed",
            delayPassed: data.delayMs <= 0,
        };

        if (state.dismissed) {
            $widget.addClass("is-dismissed");
            toggleVisibility($widget, false);
            return;
        }

        const evaluateVisibility = () => {
            if (state.dismissed) {
                toggleVisibility($widget, false);
                return;
            }

            const meetsScroll =
                data.triggerScroll <= 0 ||
                window.scrollY >= data.triggerScroll ||
                elementorFrontend.isEditMode();
            const meetsDelay = state.delayPassed || elementorFrontend.isEditMode();

            const shouldShow = meetsScroll && meetsDelay;
            toggleVisibility($widget, shouldShow);
        };

        if (data.delayMs > 0) {
            window.setTimeout(() => {
                state.delayPassed = true;
                evaluateVisibility();
            }, data.delayMs);
        }

        if (data.triggerScroll > 0 && !elementorFrontend.isEditMode()) {
            const namespace = `.kingAddonsStickyVideo.${data.unique || "default"}`;
            $(window).on(
                `scroll${namespace}`,
                () => window.requestAnimationFrame(evaluateVisibility)
            );
        }

        bindClose($widget, data, state, evaluateVisibility);
        evaluateVisibility();
    };

    $(window).on("elementor/frontend/init", function () {
        elementorFrontend.hooks.addAction(
            "frontend/element_ready/king-addons-sticky-video.default",
            function ($scope) {
                initStickyVideo($scope);
            }
        );
    });
})(jQuery);




```
