37
回編集
編集の要約なし |
編集の要約なし タグ: モバイル編集 モバイルウェブ編集 |
||
| 3行目: | 3行目: | ||
/****************************************************** | |||
* 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); | |||
var cachedTime = localStorage.getItem(keyTime); | |||
// キャッシュが有効ならそれを使う | |||
if (cached && cachedTime && now - cachedTime < ttl) { | |||
container.innerHTML = cached; | |||
return; | |||
} | |||
// API から取得 | |||
$.getJSON(mw.util.wikiScript('api'), { | |||
action: 'query', | |||
list: 'recentchanges', | |||
rclimit: 7, | |||
rcprop: 'title|timestamp|ids', | |||
rcshow: '!bot', | |||
format: 'json', | |||
maxage: 300, | |||
smaxage: 300 | |||
}, 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); | |||
} | |||
// ▼ MutationObserver で DOM 変化を監視 | |||
var observer = new MutationObserver(function () { | |||
initRecentChanges(); | |||
}); | |||
observer.observe(document.body, { childList: true, subtree: true }); | |||
// 初回実行 | |||
initRecentChanges(); | |||
}); | }); | ||