MediaWiki:Common.js

ZihuananaBot​(留言 | 贡献)2026年9月4日 (五) 17:00的版本 (新建全站脚本:倒计时模板实时更新)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/*
 * MediaWiki:Common.js — 全站通用脚本
 * 倒计时模板实时更新(配合 模板:倒计时 使用)
 */
( function ( mw, $ ) {
	'use strict';

	if ( window.dshCountdownLoaded ) {
		return;
	}
	window.dshCountdownLoaded = true;

	function pad( n ) {
		return ( n < 10 ? '0' : '' ) + n;
	}

	function parseDate( s ) {
		if ( !s ) {
			return null;
		}
		// 兼容 "YYYY-MM-DD HH:MM(:SS)"(按浏览器本地时区,北京时间即为东八区)
		// 与 "YYYY-MM-DDTHH:MM:SS+08:00" 等 ISO 8601 格式
		var t = String( s ).trim().replace( ' ', 'T' );
		var d = new Date( t );
		return isNaN( d.getTime() ) ? null : d;
	}

	function fmtSpan( ms ) {
		var neg = ms < 0;
		if ( neg ) {
			ms = -ms;
		}
		var d = Math.floor( ms / 86400000 );
		var h = Math.floor( ( ms % 86400000 ) / 3600000 );
		var m = Math.floor( ( ms % 3600000 ) / 60000 );
		var s = Math.floor( ( ms % 60000 ) / 1000 );
		var out = ( d > 0 ? d + '天 ' : '' ) + pad( h ) + ':' + pad( m ) + ':' + pad( s );
		return neg ? '-' + out : out;
	}

	function update( $el ) {
		var target = parseDate( $el.data( 'date' ) );
		var dir = $el.data( 'dir' ) === 'up' ? 'up' : 'down';
		var $val = $el.find( '.dsh-cd-value' );
		if ( !target ) {
			$val.text( '(日期格式无法解析)' );
			return;
		}
		var now = Date.now();
		var diff = dir === 'up' ? now - target.getTime() : target.getTime() - now;
		var txt;
		if ( dir === 'up' ) {
			txt = diff < 0 ? '尚未开始' : fmtSpan( diff );
		} else {
			txt = diff <= 0 ? '目标时刻已到' : fmtSpan( diff );
		}
		$val.text( txt );
	}

	mw.hook( 'wikipage.content' ).add( function ( $content ) {
		$content.find( '.dsh-cd' ).each( function () {
			var $el = $( this );
			update( $el );
			if ( !$el.data( 'dshTimer' ) ) {
				$el.data( 'dshTimer', setInterval( function () {
					update( $el );
				}, 1000 ) );
			}
		} );
	} );
}( window.mediaWiki, jQuery ) );