MediaWiki:Common.js:修订间差异

来自北京交通百科
跳转到导航 跳转到搜索
ZihuananaBot​(留言 | 贡献)
新建全站脚本:倒计时模板实时更新
 
ZihuananaBot​(留言 | 贡献)
倒计时改为大事件整天样式(还有X天/已经X天)
第1行: 第1行:
/*
/*
  * MediaWiki:Common.js — 全站通用脚本
  * MediaWiki:Common.js — 全站通用脚本
  * 倒计时模板实时更新(配合 模板:倒计时 使用)
  * 大事件倒计时实时更新(配合 模板:倒计时 使用)
  */
  */
( function ( mw, $ ) {
( function ( mw, $ ) {
第11行: 第11行:
window.dshCountdownLoaded = true;
window.dshCountdownLoaded = true;


function pad( n ) {
function esc( s ) {
return ( n < 10 ? '0' : '' ) + n;
return String( s )
.replace( /&/g, '&amp;' )
.replace( /</g, '&lt;' )
.replace( />/g, '&gt;' )
.replace( /"/g, '&quot;' );
}
}


function parseDate( s ) {
// 取本地时区的"今天 00:00"
function todayStart() {
var d = new Date();
return new Date( d.getFullYear(), d.getMonth(), d.getDate() );
}
 
// 解析目标日期:支持 YYYY-MM-DD(含时分秒会被忽略,只按整天算)
function parseTarget( s ) {
if ( !s ) {
if ( !s ) {
return null;
return null;
}
}
// 兼容 "YYYY-MM-DD HH:MM(:SS)"(按浏览器本地时区,北京时间即为东八区)
var m = String( s ).trim().match( /^(\d{4})-(\d{2})-(\d{2})/ );
// 与 "YYYY-MM-DDTHH:MM:SS+08:00" 等 ISO 8601 格式
if ( m ) {
var t = String( s ).trim().replace( ' ', 'T' );
return new Date( +m[ 1 ], +m[ 2 ] - 1, +m[ 3 ] );
var d = new Date( t );
}
var d = new Date( String( s ).trim().replace( ' ', 'T' ) );
return isNaN( d.getTime() ) ? null : d;
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 ) {
function update( $el ) {
var target = parseDate( $el.data( 'date' ) );
var target = parseTarget( $el.data( 'date' ) );
var dir = $el.data( 'dir' ) === 'up' ? 'up' : 'down';
var $txt = $el.find( '.dsh-bigcd-txt' );
var $val = $el.find( '.dsh-cd-value' );
if ( !target ) {
if ( !target ) {
$val.text( '(日期格式无法解析)' );
$txt.text( '(倒计时日期格式无法解析,请使用 YYYY-MM-DD)' );
return;
return;
}
}
var now = Date.now();
var ev = esc( $el.data( 'event' ) || '' );
var diff = dir === 'up' ? now - target.getTime() : target.getTime() - now;
var evTag = ev ? '<span class="dsh-bigcd-ev">' + ev + '</span>' : '';
var txt;
var day = 86400000;
if ( dir === 'up' ) {
var diff = Math.round( ( target.getTime() - todayStart().getTime() ) / day );
txt = diff < 0 ? '尚未开始' : fmtSpan( diff );
var num = '<span class="dsh-bigcd-num">';
if ( diff > 0 ) {
$txt.html( '距离' + evTag + '还有 ' + num + diff + '</span> 天' );
} else if ( diff === 0 ) {
$txt.html( evTag + '就是今天!' );
} else {
} else {
txt = diff <= 0 ? '目标时刻已到' : fmtSpan( diff );
$txt.html( evTag + '已经 ' + num + ( -diff ) + '</span> 天' );
}
}
$val.text( txt );
}
}


mw.hook( 'wikipage.content' ).add( function ( $content ) {
mw.hook( 'wikipage.content' ).add( function ( $content ) {
$content.find( '.dsh-cd' ).each( function () {
$content.find( '.dsh-bigcd' ).each( function () {
var $el = $( this );
var $el = $( this );
update( $el );
update( $el );
第65行: 第66行:
$el.data( 'dshTimer', setInterval( function () {
$el.data( 'dshTimer', setInterval( function () {
update( $el );
update( $el );
}, 1000 ) );
}, 60000 ) );
}
}
} );
} );
} );
} );
}( window.mediaWiki, jQuery ) );
}( window.mediaWiki, jQuery ) );

2026年9月4日 (五) 17:04的版本

/*
 * MediaWiki:Common.js — 全站通用脚本
 * 大事件倒计时实时更新(配合 模板:倒计时 使用)
 */
( function ( mw, $ ) {
	'use strict';

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

	function esc( s ) {
		return String( s )
			.replace( /&/g, '&amp;' )
			.replace( /</g, '&lt;' )
			.replace( />/g, '&gt;' )
			.replace( /"/g, '&quot;' );
	}

	// 取本地时区的"今天 00:00"
	function todayStart() {
		var d = new Date();
		return new Date( d.getFullYear(), d.getMonth(), d.getDate() );
	}

	// 解析目标日期:支持 YYYY-MM-DD(含时分秒会被忽略,只按整天算)
	function parseTarget( s ) {
		if ( !s ) {
			return null;
		}
		var m = String( s ).trim().match( /^(\d{4})-(\d{2})-(\d{2})/ );
		if ( m ) {
			return new Date( +m[ 1 ], +m[ 2 ] - 1, +m[ 3 ] );
		}
		var d = new Date( String( s ).trim().replace( ' ', 'T' ) );
		return isNaN( d.getTime() ) ? null : d;
	}

	function update( $el ) {
		var target = parseTarget( $el.data( 'date' ) );
		var $txt = $el.find( '.dsh-bigcd-txt' );
		if ( !target ) {
			$txt.text( '(倒计时日期格式无法解析,请使用 YYYY-MM-DD)' );
			return;
		}
		var ev = esc( $el.data( 'event' ) || '' );
		var evTag = ev ? '<span class="dsh-bigcd-ev">' + ev + '</span>' : '';
		var day = 86400000;
		var diff = Math.round( ( target.getTime() - todayStart().getTime() ) / day );
		var num = '<span class="dsh-bigcd-num">';
		if ( diff > 0 ) {
			$txt.html( '距离' + evTag + '还有 ' + num + diff + '</span> 天' );
		} else if ( diff === 0 ) {
			$txt.html( evTag + '就是今天!' );
		} else {
			$txt.html( evTag + '已经 ' + num + ( -diff ) + '</span> 天' );
		}
	}

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