「MediaWiki:Common.js」の版間の差分

提供:百科事典.com
ナビゲーションに移動検索に移動
編集の要約なし
編集の要約なし
編集の要約なし
タグ: モバイル編集 モバイルウェブ編集
3行目: 3行目:




mw.loader.using(['mediawiki.util'], function () { $(document).ready(function () {
/******************************************************
* Timeless 対応:最近の更新ウィジェット(完全版)
* - PC(Vector / Timeless)でも動く
* - スマホ(Timeless モバイル)でも確実に動く
* - DOM 遅延構築に対応(MutationObserver)
******************************************************/


mw.loader.using(['mediawiki.util'], function () {


    // ▼ 最近の更新を読み込む関数
    function loadRecentChanges(container) {
        var key = 'recentchanges-cache';
        var keyTime = key + '-time';
        var ttl = 5 * 60 * 1000; // 5分キャッシュ
        var now = Date.now();


/* ============================================================
        var cached = localStorage.getItem(key);
  メインページに「最近の更新(7件)」を表示するスクリプト
        var cachedTime = localStorage.getItem(keyTime);
  - タイトルのみ(差分リンクなし)
  - localStorage による5分キャッシュ
  - API の maxage/smaxage による HTTP キャッシュ
  - MediaWiki 1.39.3 で動作確認済み(ES5対応版)
  ============================================================ */


$(function () {
        // キャッシュが有効ならそれを使う
        if (cached && cachedTime && now - cachedTime < ttl) {
            container.innerHTML = cached;
            return;
        }


    // ▼ メインページ名の判定(あなたの wiki は「メインページ」)
        // API から取得
    var page = mw.config.get('wgPageName');
        $.getJSON(mw.util.wikiScript('api'), {
    if (page !== 'メインページ' && page !== 'Main_Page') {
            action: 'query',
        return; // メインページ以外では実行しない
            list: 'recentchanges',
    }
            rclimit: 7,
            rcprop: 'title|timestamp|ids',
            rcshow: '!bot',
            format: 'json',
            maxage: 300,
            smaxage: 300
        }, function (data) {
 
            var html = '<ul>';


    // ▼ localStorage 用のキー
            data.query.recentchanges.forEach(function (rc) {
    var key = 'recentchanges-cache';
                html += '<li>' +
    var keyTime = key + '-time';
                    '<a href="/wiki/' + rc.title + '">' + rc.title + '</a>' +
                    ' <span style="color:#666;">(' + rc.timestamp + ')</span>' +
                    '</li>';
            });


    // ▼ キャッシュの有効期限(ミリ秒)→ 5分
            html += '</ul>';
    var ttl = 5 * 60 * 1000;
    var now = Date.now();


    // ▼ localStorage にキャッシュがあれば利用
            // キャッシュ保存
    var cached = localStorage.getItem(key);
            localStorage.setItem(key, html);
    var cachedTime = localStorage.getItem(keyTime);
            localStorage.setItem(keyTime, now);


    if (cached && cachedTime && now - cachedTime < ttl) {
            container.innerHTML = html;
        $('#recentchanges-container').html(cached);
         });
         return; // API を叩かず終了
     }
     }


     // ▼ MediaWiki API を呼び出して最近の更新を取得
     // ▼ 要素が出現した瞬間に実行する関数
     $.getJSON(mw.util.wikiScript('api'), {
     function initRecentChanges() {
         action: 'query',
         var container = document.getElementById('recentchanges-container');
        list: 'recentchanges',
         if (!container) return;
         rclimit: 7,                    // 取得件数
        rcprop: 'title|timestamp|ids',  // タイトル・時刻・差分ID
        rcshow: '!bot',                // Bot 編集を除外(不要なら削除)
        format: 'json',


         // ▼ HTTP キャッシュ(ブラウザ・CDN)
         // 二重実行防止
         maxage: 300,  // ブラウザキャッシュ 5分
         if (container.dataset.loaded) return;
         smaxage: 300  // CDNキャッシュ 5分
         container.dataset.loaded = "1";
    }, function (data) {


         var html = '<ul>';
         loadRecentChanges(container);
    }


        data.query.recentchanges.forEach(function (rc) {
    // ▼ MutationObserver で DOM 変化を監視
    var observer = new MutationObserver(function () {
        initRecentChanges();
    });


            // ▼ リスト項目の HTML(差分リンクなし)
    observer.observe(document.body, { childList: true, subtree: true });
            html +=
                '<li>' +
                    '<a href="/' + rc.title + '">' + rc.title + '</a>' +
                    '&nbsp;' +
                    '(' + rc.timestamp + ')' +
                '</li>';
        });


        html += '</ul>';
    // 初回実行
 
    initRecentChanges();
        // ▼ localStorage にキャッシュ保存
        localStorage.setItem(key, html);
        localStorage.setItem(keyTime, now);
 
        // ▼ メインページに表示
        $('#recentchanges-container').html(html);
    });
});
});
// ここにあなたのコード全部
}); });

案内メニュー