MediaWiki:Common.js: Perbedaan antara revisi

Tidak ada ringkasan suntingan
Tanda: Dikembalikan Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Dikembalikan Suntingan perangkat seluler Suntingan peramban seluler
Baris 1: Baris 1:
/* ==========================================================================
/* ==========================================================================
   ⚡ FITUR ULTRA-ADVANCED: INSTANT PAGE PRELOADER (SPEED ACCELERATOR)
   ⚡ ULTRA-SPEED: INSTANT PRERENDERER ACCELERATOR (NEAR-ZERO DELAY)
   ========================================================================== */
   ========================================================================== */
$(document).ready(function() {
$(document).ready(function() {
     // 1. Cek keamanan: Jangan jalan kalau bukan halaman baca, atau fitur browser tidak mendukung
     // 1. Validasi Keamanan: Hanya jalan di halaman baca artikel
     if (!mw.config.get('wgIsArticle') || mw.config.get('wgAction') !== 'view' || !document.createElement('link').relList.supports('prefetch')) {
     if (!mw.config.get('wgIsArticle') || mw.config.get('wgAction') !== 'view') return;
        return;
    }


     // 2. Proteksi Server & User: Matikan fitur jika user pakai hemat data (Save-Data) atau koneksi lambat (2G/3G)
     // 2. Proteksi Server: Cek fitur hemat data atau koneksi lambat seluler
     var koneksi = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
     var koneksi = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
     if (koneksi) {
     if (koneksi && (koneksi.saveData || /(2g|3g)/i.test(koneksi.effectiveType || ''))) return;
        if (koneksi.saveData || (koneksi.effectiveType && koneksi.effectiveType.indexOf('2g') !== -1) || (koneksi.effectiveType && koneksi.effectiveType.indexOf('3g') !== -1)) {
            return; // Berhenti total demi menghemat beban server & kuota user
        }
    }


     var prefetchTimer;
     var $tagRenderLama = null;
    var listSudahPreload = {}; // Memastikan satu halaman hanya di-download sekali per kunjungan


     // 3. Targetkan link internal asli dalam konten artikel Mippedia
     // 3. Tangkap link internal di konten utama Mippedia
     $('.mw-parser-output a[href^="/wiki/"]').not('[href*=":"]').not('.image').not('.new').each(function() {
     $('.mw-parser-output a[href^="/wiki/"]')
        var $link = $(this);
        .not('[href*=":"], .image, .new, .external')
        var urlTarget = $link.attr('href');
        .on('mouseenter mousedown touchstart', function(e) {
           
            var urlTarget = $(this).attr('href');
            if (!urlTarget) return;


        if (urlTarget) {
             // Jika dipicu oleh mouseenter (kursor masuk), beri jeda tunda pintar 50ms
             $link.on('mouseenter touchstart', function() {
            // Jika dipicu mousedown/touchstart (klik/sentuh), langsung hajar tanpa tunda!
                // Jika url belum pernah di-preload
            var jedaTunda = (e.type === 'mouseenter') ? 50 : 0;
                if (!listSudahPreload[urlTarget]) {
                   
                    // Beri jeda sangat tipis (65ms) untuk memastikan user emang mau nge-klik link itu
                    prefetchTimer = setTimeout(function() {
                       
                        // Membuat elemen <link rel="prefetch"> secara dinamis
                        var pancinganPreload = document.createElement('link');
                        pancinganPreload.rel = 'prefetch';
                        pancinganPreload.href = urlTarget;
                        pancinganPreload.as = 'document';
                       
                        document.head.appendChild(pancinganPreload);
                       
                        // Kunci URL-nya biar tidak di-request lagi secara berulang
                        listSudahPreload[urlTarget] = true;
                       
                    }, 65);
                }
            });


             // Jika kursor cuma lewat cepet (tidak jadi nge-klik), batalkan proses biar server gak dapet spam request
             clearTimeout($(this).data('timerRender'));
             $link.on('mouseleave touchend', function() {
 
                clearTimeout(prefetchTimer);
            var $linkIni = $(this);
            });
            var timer = setTimeout(function() {
         }
                // Cek apakah url ini yang sedang aktif di-prerender, jika iya ganti target
    });
                if ($tagRenderLama && $tagRenderLama.attr('href') === urlTarget) return;
 
                // Buang slot prerender lama agar server tidak melayani request ganda
                if ($tagRenderLama) $tagRenderLama.remove();
 
                // Suntik elemen prerender dengan prioritas tinggi
                $tagRenderLama = $('<link>', {
                    rel: 'prerender speculationrules', // Mendukung standar browser lama & modern (Speculation Rules API)
                    href: urlTarget,
                    as: 'document'
                }).appendTo('head');
 
            }, jedaTunda);
 
             $linkIni.data('timerRender', timer);
        })
        .on('mouseleave touchend', function() {
            // Batalkan seketika jika kursor cuma numpang lewat cepat
            clearTimeout($(this).data('timerRender'));
         });
});
});