|
|
| 第1行: |
第1行: |
| /* | | /* |
| * MediaWiki:Common.js — 全站通用脚本 | | * MediaWiki:Common.js — 全站通用脚本 |
| * 大事件倒计时实时更新(配合 模板:倒计时 使用) | | * (倒计时由 模板:倒计时 + 模块:倒计时(Scribunto)实现,无需 JavaScript) |
| */ | | */ |
| ( function ( mw, $ ) {
| |
| 'use strict';
| |
|
| |
| if ( window.dshCountdownLoaded ) {
| |
| return;
| |
| }
| |
| window.dshCountdownLoaded = true;
| |
|
| |
| function esc( s ) {
| |
| return String( s )
| |
| .replace( /&/g, '&' )
| |
| .replace( /</g, '<' )
| |
| .replace( />/g, '>' )
| |
| .replace( /"/g, '"' );
| |
| }
| |
|
| |
| // 取本地时区的"今天 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 ) );
| |