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,…” |
无编辑摘要 |
||
| (未显示2个用户的9个中间版本) | |||
| 第1行: | 第1行: | ||
<noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly | <noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><script> | ||
"use strict"; | "use strict"; | ||
(function() { | |||
// 等候网页基础内容加载完毕再动手,防止找不到元素 | |||
if (document.readyState === 'loading') { | |||
const fromNow = (then, before, after, on) => { | document.addEventListener('DOMContentLoaded', setupCountdown); | ||
} else { | |||
setupCountdown(); | |||
} | |||
function setupCountdown() { | |||
// 核心计算逻辑:完全使用原生 Date 对象替代 moment.js | |||
const fromNow = (then, before, after, on) => { | |||
const now = new Date(); | |||
const isBefore = then.getTime() < now.getTime(); | |||
// 为了方便做减法,把大的时间放前面 | |||
const t1 = isBefore ? now : then; | |||
const t2 = isBefore ? then : now; | |||
let year = t1.getFullYear() - t2.getFullYear(), | |||
month = t1.getMonth() - t2.getMonth(), | |||
day = t1.getDate() - t2.getDate(), | |||
hour = t1.getHours() - t2.getHours(), | |||
minute = t1.getMinutes() - t2.getMinutes(), | |||
second = t1.getSeconds() - t2.getSeconds(); | |||
// 借位计算( | |||
if (second < 0) { minute--; second += 60; } | |||
if (minute < 0) { hour--; minute += 60; } | |||
day += | if (hour < 0) { day--; hour += 24; } | ||
} else if (( | if (day < 0) { | ||
month--; | |||
// 获取上个月到底有多少天来补齐 | |||
let prevMonthDays = new Date(t1.getFullYear(), t1.getMonth(), 0).getDate(); | |||
day += prevMonthDays; | |||
} | |||
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); | |||
}; | |||
// 第一步:把网页上所有的倒计时盒子找出来,并给它们分配好时间 | |||
document.querySelectorAll(".countdownNode").forEach(ele => { | |||
const timeStr = ele.dataset.target || ele.getAttribute("data-target"); | |||
if (!timeStr) return; | |||
// 兼容性处理:把横杠换成斜杠,防止苹果设备报错 | |||
const safeTimeStr = timeStr.replace(/-/g, '/'); | |||
const time = new Date(safeTimeStr); | |||
if (isNaN(time.getTime())) { | |||
ele.classList.add("error", "disabled"); | |||
ele.textContent = "(时间格式解析错误!)"; | |||
} else { | } else { | ||
ele._countdownTarget = time; | |||
} | } | ||
}); | }); | ||
// 第二步:执行更新的动作 | |||
const run = () => { | |||
document.querySelectorAll(".countdownNode:not(.disabled)").forEach(ele => { | |||
const time = ele._countdownTarget; | |||
if (time && !isNaN(time.getTime())) { | |||
ele.textContent = fromNow( | |||
} | time, | ||
ele.dataset.before || "$1前", | |||
ele.dataset.after || "还剩$1", | |||
ele.dataset.on || "就是现在!" | |||
); | |||
}); | } | ||
</script | }); | ||
}; | |||
// 马上显示一次,然后每隔 1000 毫秒(1秒)跳动一次 | |||
run(); | |||
window.setInterval(run, 500); | |||
} | |||
})(); | |||
</script></includeonly> | |||
2026年3月4日 (三) 13:27的最新版本
仅供{{Countdown}}使用。