8chan - global gallery mod

Modifies the advanced media viewer (turn it on in site's settings) to consider the whole thread its gallery, not just the post, also ads focus to image you open with arrow keys

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu betiği yüklemek için bir betik yöneticisi eklentisi yüklemeniz gerekecektir.

(Zaten bir betik yöneticim var, hadi yükleyelim!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         8chan - global gallery mod
// @namespace    8chan_ggm
// @version      2026-07-31
// @description  Modifies the advanced media viewer (turn it on in site's settings) to consider the whole thread its gallery, not just the post, also ads focus to image you open with arrow keys
// @author       Owyn
// @match        https://8chan.moe/*
// @match        https://8chan.st/*
// @match        http://alephchvkipd2houttjirmgivro5pxullvcgm4c47ptm7mhubbja6kad.onion/*
// @grant        unsafeWindow
// @run-at       document-start
// @sandbox      JavaScript
// @compatible   Chrome
// @compatible   Firefox
// ==/UserScript==

(function() {
    'use strict';

    // mediaLink.closest('.panelUploads')?.querySelectorAll('.imgLink') // - how gallery is populated
    const originalClosest = unsafeWindow.Element.prototype.closest;
    if(typeof exportFunction === "function")
    {
        wrapper_closest = exportFunction(wrapper_closest , unsafeWindow); // TM magic
    }
    unsafeWindow.Element.prototype.closest = wrapper_closest;
    function wrapper_closest (selectors) {
        if(selectors == ".panelUploads")
        {
            console.log(`they wanted Closest [${selectors}] but we returned doc.body and focused this:`, this);
            this.scrollIntoView();
            return document.body;
        }
        else return originalClosest.call(this, selectors);
    };
})();