MediaWiki:Gadget-DeferredDisplay.js

From JoJo's Bizarre Encyclopedia - JoJo Wiki
Revision as of 12:20, 26 July 2024 by Vish (talk | contribs)
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Deferred display of {{tl|nsfw}}-tagged images.
 * jshint validation
 * @author Dschwen, 2013 / Vish, 2023
 */
 
$(document).ready(function() {
    function applyNSFWOverlay(container) {
        container.css({
            backgroundImage: 'url("https://static.jojowiki.com/images/customizations/Dialog-warning-yellow.png")',
            backgroundRepeat: 'no-repeat',
            backgroundPosition: 'center'
        }).find('img').css('visibility', 'hidden');

        container.one('click', function(e) {
            $(this).css('backgroundImage', '').find('img').css('visibility', '');
            e.preventDefault();
        });
    }

    function checkAndApplyNSFWOverlay() {
        $('.nsfwelement').each(function() {
            var nsfwElement = $(this);
            var container = nsfwElement.closest('.thumbinner, .gallerybox');

            if (container.length && !container.data('nsfw-applied')) {
                var img = container.find('img.thumbimage');
                if (img.length) {
                    applyNSFWOverlay(container);
                    container.data('nsfw-applied', true);
                }
            }
        });
    }

    function setupLazyLoadObserver() {
        var observer = new IntersectionObserver(function(entries) {
            entries.forEach(function(entry) {
                if (entry.isIntersecting) {
                    var container = $(entry.target).closest('.thumbinner, .gallerybox');
                    if (container.find('.nsfwelement').length > 0) {
                        applyNSFWOverlay(container);
                        container.data('nsfw-applied', true);
                    }
                }
            });
        });

        $('img.thumbimage').each(function() {
            observer.observe(this);
        });
    }

    // Apply overlay initially
    checkAndApplyNSFWOverlay();

    // Setup observer for lazy-loaded images
    setupLazyLoadObserver();

    // Re-apply overlay on window load to handle any remaining lazy-loaded images
    $(window).on('load', function() {
        checkAndApplyNSFWOverlay();
    });
});