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

提供:百科事典.com
ナビゲーションに移動 検索に移動
編集の要約なし
タグ: モバイル編集 モバイルウェブ編集
編集の要約なし
タグ: モバイル編集 モバイルウェブ編集
 
5行目: 5行目:
/******************************************************
/******************************************************
  * Timeless 対応:最近の更新ウィジェット(完全版)
  * Timeless 対応:最近の更新ウィジェット(完全版)
* - PC(Vector / Timeless)でも動く
* - スマホ(Timeless モバイル)でも確実に動く
* - DOM 遅延構築に対応(MutationObserver)
  ******************************************************/
  ******************************************************/


22行目: 19行目:
         var cachedTime = localStorage.getItem(keyTime);
         var cachedTime = localStorage.getItem(keyTime);


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


        // API から取得
         $.getJSON(mw.util.wikiScript('api'), {
         $.getJSON(mw.util.wikiScript('api'), {
             action: 'query',
             action: 'query',
35行目: 30行目:
             rcprop: 'title|timestamp|ids',
             rcprop: 'title|timestamp|ids',
             rcshow: '!bot',
             rcshow: '!bot',
             format: 'json',
             format: 'json'
            maxage: 300,
            smaxage: 300
         }, function (data) {
         }, function (data) {


51行目: 44行目:
             html += '</ul>';
             html += '</ul>';


            // キャッシュ保存
             localStorage.setItem(key, html);
             localStorage.setItem(key, html);
             localStorage.setItem(keyTime, now);
             localStorage.setItem(keyTime, now);
64行目: 56行目:
         if (!container) return;
         if (!container) return;


        // 二重実行防止
         if (container.dataset.loaded) return;
         if (container.dataset.loaded) return;
         container.dataset.loaded = "1";
         container.dataset.loaded = "1";
71行目: 62行目:
     }
     }


     // ▼ MutationObserver で DOM 変化を監視
     // ▼ Timeless は DOM を後から組み替えるので監視が必須
     var observer = new MutationObserver(function () {
     var observer = new MutationObserver(function () {
         initRecentChanges();
         initRecentChanges();

2026年2月23日 (月) 05:25時点における最新版

/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */



/******************************************************
 * Timeless 対応:最近の更新ウィジェット(完全版)
 ******************************************************/

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);
        var cachedTime = localStorage.getItem(keyTime);

        if (cached && cachedTime && now - cachedTime < ttl) {
            container.innerHTML = cached;
            return;
        }

        $.getJSON(mw.util.wikiScript('api'), {
            action: 'query',
            list: 'recentchanges',
            rclimit: 7,
            rcprop: 'title|timestamp|ids',
            rcshow: '!bot',
            format: 'json'
        }, function (data) {

            var html = '<ul>';

            data.query.recentchanges.forEach(function (rc) {
                html += '<li>' +
                    '<a href="/wiki/' + rc.title + '">' + rc.title + '</a>' +
                    ' <span style="color:#666;">(' + rc.timestamp + ')</span>' +
                    '</li>';
            });

            html += '</ul>';

            localStorage.setItem(key, html);
            localStorage.setItem(keyTime, now);

            container.innerHTML = html;
        });
    }

    // ▼ 要素が出現した瞬間に実行する関数
    function initRecentChanges() {
        var container = document.getElementById('recentchanges-container');
        if (!container) return;

        if (container.dataset.loaded) return;
        container.dataset.loaded = "1";

        loadRecentChanges(container);
    }

    // ▼ Timeless は DOM を後から組み替えるので監視が必須
    var observer = new MutationObserver(function () {
        initRecentChanges();
    });

    observer.observe(document.body, { childList: true, subtree: true });

    // 初回実行
    initRecentChanges();
});