|
|
| (未显示同一用户的1个中间版本) |
| 第1行: |
第1行: |
| /* | | /* |
| * MediaWiki:Common.js — 全站通用脚本 | | * MediaWiki:Common.js — 全站通用脚本 |
| * 倒计时模板实时更新(配合 模板:倒计时 使用) | | * (倒计时由 模板:倒计时 + 模块:倒计时(Scribunto)实现,无需 JavaScript) |
| */ | | */ |
| ( 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 ) );
| |