カウントダウンタイマーなんだけど、こんな書き方をしてごめんなさい!
OKWaveの回答
http://oshiete1.goo.ne.jp/qa5834111.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title></title> <body> <form action="#"> <p> <input type="text" value="" id="fuga"> <input type="button" value="+10m" onclick="addM(10)"> </p> </form> <script type="text/Javascript"> var a; function hoge(e,y,m,d,j,f,b,ms){ a=(new Date(y,m-1,d,j||0,f||0,b||0,ms||0))-0; (function c(){ var b=(a-(new Date))/1000|0; if(b>0){ e.value = fuga(b,4).replace(/(\d+)(\d{2})(\d{2})(\d{2})$/,'$1日$2時$3分$4秒'); setTimeout(c,1000); }else e.value = 'end'; })(); } function fuga(n,t){ if(!t)return '';var w=[0,10000,24,60,60][t--],r=n/w|0,s=n%w; return fuga(r,t)+(s<10?'0'+s:s); } function addM(m){a+=m*60000} hoge( document.getElementById('fuga'), 2010, 4, 20, 0, 0, 0, 0); </script>
こんな回答をするのなら、アップしないほうが良い。あ〜反省。
昔の俺だったら、食いついてるだろうなぁ〜
再帰って、arguments.calleeで呼ばなきゃだめか?
しかも、ショートコーディングと、回答者にわかりやすくと思って、グローバル変数つかおう!
と思って書いてたら、だめだ!こりゃ〜なコードになった!
何が必要で・・・何が不要で・・・
遊びで始めたプログラミングだしなぁ〜
公共の場に、ごみを撒き散らすのも、公害か・・・。
いっぺん、心の整理でもしてみよう!
追記
なんと御礼があった。とても参考になりました。 本当にありがとうございました。
絶対に嘘だな!あれがあの問題での参考になるはずなどない。
再帰の中で、単位もつければ、正規表現を使わなくても済んだのに!
- その2です。サポートで確認中だとかで、表示されてない!なんでだろう!
もろもろの指摘を受け、再度、OKWaveに投稿したサンプル
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>CountDown</title> <body> <form action="#"> <p> <input type="text" value="" id="fuga"> <input type="button" value="+10m" onclick="extensionTime(10)"> </p> </form> <script type="text/Javascript"><!-- var time; var base = [ 100000, 24, 60, 60, 1000 ]; var unit = [ '日', '時', '分', '秒', '' ]; var e = document.getElementById( 'fuga' ); var d = ( new Date( 2010, 4 - 1, 20, 0, 0, 0, 0 ) ).getTime( ); //____ function convert( serial ) { return (function ( n, c ) { var u = unit[ c ]; var b = base[ c ] || 1; var r = Math.floor( n / b ); var s = ''; if( !!u ) s = ('000000000' + ( n - r * b )).slice( -( b + '').length ) + u; if( 0 < c ) return arguments.callee( r, c - 1 ) + s; else return n + u; })( serial, 4 ); } //____ function disp( ) { time = d - ( new Date ).getTime( ); if( 0 < time ) { e.value = convert( time ); return true; } else { return false; } } function extensionTime ( minute /* Minute */ ) { if( 'number' === typeof minute ) { d += minute * 60 * 1000; disp( ); } } function demo ( ) { if( disp( ) ) setTimeout( arguments.callee, 1000 ); else e.value = '終了'; } //__ demo(); //--> </script>
- オブジェクト指向的なつもりで書いてみたサンプル
2箇所同時作動版
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>DownCounter</title> <body> <form action="#"> <p> <input type="text" value="" id="Countdown1" style="width: 15em;"> <input type="button" value="+10m" onclick="cnt1.extend(10)"> <input type="button" value="Start" onclick="cnt1.start()"> <input type="button" value="Stop" onclick="cnt1.stop()"> </p> <p> <input type="text" value="" id="Countdown2" style="width: 15em;"> <input type="button" value="+5m" onclick="cnt2.extend(5)"> <input type="button" value="Start" onclick="cnt2.start()"> <input type="button" value="Stop" onclick="cnt2.stop()"> </p> </form> <script type="text/javascript"> //@cc_on var DownCounter = function ( ) { this.init.apply( this, arguments ); }; DownCounter.prototype.init = function ( target, date ) { this.e = target; this.d = date.getTime( ); this.i = null; this.start(); }; DownCounter.prototype.start = function ( ) { var cbFunc = (function ( that ) { return function ( ) { that.disp( ) || that.stop( ); }; })( this ); this.i && this.stop( ); this.disp( ); return this.i = setInterval( cbFunc, 1000 ); }; DownCounter.prototype.stop = function ( ) { if( this.i ) { clearInterval( this.i ); this.i = null; return true; } return false; }; DownCounter.prototype.extend = function ( time ) { this.d += time * 60 * 1000; return this.disp(); }; DownCounter.prototype.disp = (function ( convert ) { return function ( ) { var time = this.d - ( new Date ).getTime( ); if( 0 < time ) { this.e.value = convert( time ); return true; } this.e.value = '終了'; return false; }; })((function ( ) { var base = [ 100000, 24, 60, 60, 1000 ]; var unit = [ '日', '時', '分', '秒', '' ]; return function ( serial ) { return (function ( n, c ) { var u = unit[ c ]; var b = base[ c ] || 1; var r = Math.floor( n / b ); var s = ''; if( !!u ) s = ('000000000' + ( n - r * b )).slice( -( b + '').length ) + u; if( 0 < c ) return arguments.callee( r, c - 1 ) + s; else return n + u; })( serial, 4 ); }; })() ); //_____ DownCounter.create = function ( targetId, dateObject ) { var target; if( !(target = document.getElementById( targetId ) ) || 'object' !== typeof dateObject ) return null; return new this( target, dateObject ); }; var cnt1 = DownCounter.create( 'Countdown1', new Date( 2010, 4, 1) ); var cnt2 = DownCounter.create( 'Countdown2', new Date( 2010, 5, 1) ); </script>