打开/关闭搜索
搜索
打开/关闭菜单
6629
8
8126
OGAS数据中枢
导航
首页
最近更改
随机页面
特殊页面
批量上传
上传文件
Special:BatchUpload|批量上传
打开/关闭外观设置菜单
通知
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
创建账号
登录
查看“︁Widget:Countdown”︁的源代码
来自OGAS数据中枢
分享此页面
更多语言
查看
阅读
查看源代码
查看历史
associated-pages
页面
讨论
更多操作
←
Widget:Countdown
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
管理员
您可以查看和复制此页面的源代码。
<noinclude>仅供{{tl|Countdown}}使用。</noinclude><includeonly><script> "use strict"; (function() { // 等候网页基础内容加载完毕再动手,防止找不到元素 if (document.readyState === 'loading') { 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; } if (hour < 0) { day--; hour += 24; } 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 { 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 || "就是现在!" ); } }); }; // 马上显示一次,然后每隔 1000 毫秒(1秒)跳动一次 run(); window.setInterval(run, 1000); } })(); </script></includeonly>
该页面嵌入的页面:
Template:Tl
(
查看源代码
)
Template:Transclude
(
查看源代码
)
返回
Widget:Countdown
。
查看“︁Widget:Countdown”︁的源代码
来自OGAS数据中枢