Widget:Countdown:修订间差异
来自OGAS数据中枢
更多语言
更多操作
imported>弃权者 无编辑摘要 |
无编辑摘要 |
||
| (未显示2个用户的7个中间版本) | |||
| 第1行: | 第1行: | ||
<noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly | <noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><script> | ||
"use strict"; | "use strict"; | ||
(function() { | (function() { | ||
if ( | // 等候网页基础内容加载完毕再动手,防止找不到元素 | ||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', setupCountdown); | |||
} else { | |||
setupCountdown(); | |||
} | } | ||
function setupCountdown() { | |||
// 核心计算逻辑:完全使用原生 Date 对象替代 moment.js | |||
const fromNow = (then, before, after, on) => { | const fromNow = (then, before, after, on) => { | ||
const now = | const now = new Date(); | ||
const isBefore = then. | const isBefore = then.getTime() < now.getTime(); | ||
const | |||
// 为了方便做减法,把大的时间放前面 | |||
month = | const t1 = isBefore ? now : then; | ||
day = | const t2 = isBefore ? then : now; | ||
hour = | |||
minute = | let year = t1.getFullYear() - t2.getFullYear(), | ||
second = | month = t1.getMonth() - t2.getMonth(), | ||
if (second < 0) { | day = t1.getDate() - t2.getDate(), | ||
hour = t1.getHours() - t2.getHours(), | |||
minute = t1.getMinutes() - t2.getMinutes(), | |||
second = t1.getSeconds() - t2.getSeconds(); | |||
if (minute < 0) { | |||
// 借位计算( | |||
if (second < 0) { minute--; second += 60; } | |||
if (minute < 0) { hour--; minute += 60; } | |||
if (hour < 0) { | if (hour < 0) { day--; hour += 24; } | ||
if (day < 0) { | if (day < 0) { | ||
month--; | month--; | ||
// 获取上个月到底有多少天来补齐 | |||
let prevMonthDays = new Date(t1.getFullYear(), t1.getMonth(), 0).getDate(); | |||
day += prevMonthDays; | |||
} | } | ||
if (month < 0) { year--; month += 12; } | |||
// 组装最终显示的文字 | |||
let result = ""; | let result = ""; | ||
if (year > 0) | 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 { | |||
ele._countdownTarget = time; | |||
} | } | ||
}); | |||
// 第二步:执行更新的动作 | |||
const run = () => { | const run = () => { | ||
document.querySelectorAll(".countdownNode:not(.disabled)").forEach(ele => { | |||
const | const time = ele._countdownTarget; | ||
if (time && !isNaN(time.getTime())) { | |||
ele.textContent = fromNow( | |||
time, | |||
ele.dataset.before || "$1前", | |||
ele.dataset.after || "还剩$1", | |||
ele.dataset.on || "就是现在!" | |||
); | |||
} | |||
}); | }); | ||
}; | }; | ||
// 马上显示一次,然后每隔 1000 毫秒(1秒)跳动一次 | |||
run(); | |||
window.setInterval(run, 500); | |||
} | } | ||
})(); | })(); | ||
</script | </script></includeonly> | ||
2026年3月4日 (三) 13:27的最新版本
仅供{{Countdown}}使用。