Widget:Countdown:修订间差异
来自OGAS数据中枢
更多语言
更多操作
imported>弃权者 创建页面,内容为“<noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><!--{if !isset($wgCountdown) || !$wgCountdown}--><!--{assign var="wgCountdown" value=true scope="global"}--><script> "use strict"; window.RLQ = window.RLQ || []; window.RLQ.push(async () => { await mw.loader.using("moment"); const fromNow = (then, before, after, on) => { const now = moment(); const isBefore = then.isBefore(now); const monthsHave31Days = [0, 2, 4,…” |
imported>弃权者 无编辑摘要 |
||
| 第1行: | 第1行: | ||
<noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><!--{if !isset($wgCountdown) || !$wgCountdown}--><!--{assign var="wgCountdown" value=true scope="global"}--><script> | <noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><!--{if !isset($wgCountdown) || !$wgCountdown}--><!--{assign var="wgCountdown" value=true scope="global"}--><script> | ||
"use strict"; | "use strict"; | ||
(function() { | |||
if (typeof moment !== 'undefined') { | |||
initCountdown(); | |||
const fromNow = (then, before, after, on) => { | return; | ||
} | |||
const script = document.createElement('script'); | |||
script.src = 'https://cdn.staticfile.org/moment.js/2.29.4/moment.min.js'; | |||
script.onload = initCountdown; | |||
script.onerror = () => { | |||
console.error('无法加载 moment.js,倒计时功能不可用'); | |||
document.querySelectorAll('.countdownNode').forEach(el => { | |||
el.textContent = '(无法加载时间库)'; | |||
el.classList.add('error'); | |||
}); | |||
}; | |||
document.head.appendChild(script); | |||
function initCountdown() { | |||
const fromNow = (then, before, after, on) => { | |||
const now = moment(); | |||
const isBefore = then.isBefore(now); | |||
const monthsHave31Days = [0, 2, 4, 6, 7, 9, 11]; | |||
let year = isBefore ? now.year() - then.year() : then.year() - now.year(), | |||
month = isBefore ? now.month() - then.month() : then.month() - now.month(), | |||
day = isBefore ? now.date() - then.date() : then.date() - now.date(), | |||
hour = isBefore ? now.hour() - then.hour() : then.hour() - now.hour(), | |||
minute = isBefore ? now.minute() - then.minute() : then.minute() - now.minute(), | |||
second = isBefore ? now.second() - then.second() : then.second() - now.second(); | |||
if (second < 0) { | |||
minute--; | |||
day += | second += 60; | ||
} | |||
if (minute < 0) { | |||
hour--; | |||
minute += 60; | |||
} | |||
if (hour < 0) { | |||
day--; | |||
hour += 24; | |||
} | |||
if (day < 0) { | |||
month--; | |||
if (monthsHave31Days.includes((isBefore ? then : now).month())) { | |||
day += 31; | |||
} else if ((isBefore ? then : now).month() === 1) { | |||
if ((isBefore ? then : now).year() % 4 === 0) { | |||
day += 29; | |||
} else { | |||
day += 28; | |||
} | |||
} else { | } else { | ||
day += | day += 30; | ||
} | } | ||
} | } | ||
if (month < 0) { | |||
year--; | |||
month += 12; | |||
} | |||
let result = ""; | |||
if (year > 0) { | |||
result += `${year}年`; | |||
} | |||
if (month > 0) { | |||
result += `${month}月`; | |||
} else if (result !== "") { | |||
result += `${0}月`; | |||
} | |||
if (day > 0) { | |||
result += `${day}日`; | |||
} else if (result !== "") { | |||
result += `${0}日`; | |||
} | |||
if (hour > 0) { | |||
result += `${hour}小时`; | |||
} else if (result !== "") { | |||
result += `${0}小时`; | |||
} | |||
if (minute > 0) { | |||
result += `${minute}分`; | |||
} else if (result !== "") { | |||
result += `${0}分`; | |||
} | |||
if (second > 0) { | |||
result += `${second}秒`; | |||
} else if (result !== "") { | |||
result += `${0}秒`; | |||
} | |||
return (result === "" ? on : isBefore ? before : after).replace("$1", result.replace(/(\d) /g, "$1")); | |||
}; | |||
const run = () => { | |||
$(".countdownNode:not(.disabled)").each((_, ele) => { | |||
const self = $(ele); | |||
self.text(fromNow(self.data("target"), ele.dataset.before || "$1前", ele.dataset.after || "还剩$1", ele.dataset.on || "就是现在!")); | |||
}); | |||
}; | |||
$(() => { | |||
$(".countdownNode").each((_, ele) => { | |||
const self = $(ele), | |||
time = moment(ele.dataset.target); | |||
if (!time || !time.isValid()) { | |||
self.addClass("error disabled").text("(发生了致命错误!)"); | |||
return; | |||
} | |||
self.data("target", time); | |||
}); | |||
run(); | |||
window.setInterval(run, 1000); | |||
}); | }); | ||
} | } | ||
})(); | |||
</script><!--{/if}--></includeonly> | </script><!--{/if}--></includeonly> | ||
2026年3月3日 (二) 08:34的版本
仅供{{Countdown}}使用。