コードをスマートにさせる方法

このQ&Aのポイント
  • jQueryとPHPを使い、画面遷移せずに回すクリックカウンターを作成しましたが、カウンターのコードがスッキリしない問題があります。
  • カウンターを2つ並べて表示していますが、この01,02の数字を変数にして指定回数ループで回す方法がわかりません。
  • 修正したい点としては、初期時のカウンターファイルの読み込みやカウンター追加後の読み込み処理をもっとシンプルにしたいです。
回答を見る
  • ベストアンサー

コードをスマートにさせたい。

jQueryとPHPを使い、画面遷移せずに回すクリックカウンター http://1bit.mobi/20110112164331.html 現在、上記のカウンターを2つ並べています。 この01,02の数字を変数にして指定回数ループで回してコードがスッキリさせたいのですが、 うまくいきませんでした。どのように修正したらよいでしょうか? http://olo.sakura.ne.jp/test/test.html jQuery(document).ready(function(){ //初期時のカウンターファイル読み込み var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("count/count01.txt?r=" + randnum1); jQuery("#btn02 span").load("count/count02.txt?r=" + randnum1); //カウンター追加後の読み込み関数 function func01(data){ var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("count/count01.txt?r=" + randnum1); } function func02(data){ var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn02 span").load("count/count02.txt?r=" + randnum1); } //カウンター+1追加処理 jQuery('#btn01 p').click(function(e){ //「param1」変数の値と書き込みファイル名の情報をもってpost.phpへ。その後、関数func01を実行 jQuery.post("count/post.php" , {"param1": 'count01.txt'} , func01); }); jQuery('#btn02 p').click(function(e){ //「param1」変数の値と書き込みファイル名の情報をもってpost.phpへ。その後、関数func02を実行 jQuery.post("count/post.php" , {"param1": 'count02.txt'} , func02); }); });

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

回答がないみたいなので… テスト環境がないので雰囲気のみですが、こんな感じ? (対象が2個だけなので、ほとんど短くもスマートにもなっていませんが…) 全角空白は半角に // カウンター読込み(表示) function load(n){  var uri = "count/count0" + n + ".txt?r=" + Math.floor(Math.random() * 10000);  jQuery("#btn0" + n + " span").load(uri); } // 初期表示+イベント設定 for(var n=0; ++n<3;){  load(n);  jQuery("#btn0" + n + " p").click(   (function(m){    return function(){     jQuery.post("count/post.php", {"param1":"count0" + m + ".txt"}, function(){load(m);});    };   })(n)  ); } *テストしていませんので、タイポなどありましたらご容赦。

hhunngry
質問者

お礼

すばらしい! 修正なしでそのままコードを適用できました! http://olo.sakura.ne.jp/test/test.html 10個以上カウンターを設置したかったのでコードが10分の1で済みます。 ありがとうございましたm(_)m ループの使い方も勉強させていただきます。

関連するQ&A

  • クリックカウンターの挙動がおかしい

    jQueryとPHPを使い、画面遷移せずに回すクリックカウンター http://1bit.mobi/20110112164331.html こちらのカウンターを設置してみたのですが少し動作がおかしいです。 http://olo.sakura.ne.jp/test/test1.html 連続でクリックすると古い数字が出た後に正しい数字が表示されます。 何故か2回数字が更新されてしまうのです。 ブラウザにより挙動が異なりIE,Firefox,Chromeでは上記のように iPodtouch,3DSのブラウザでは正常に動作しました。 解決策はありますでしょうか?よろしくお願いします。 jQuery(document).ready(function(){ //初期時のカウンターファイル読み込み //ランダムな数字を生成し、パラメータとして付けることで、ユニークな状態にする。 var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("./count01.txt?r=" + randnum1); //カウンター追加後の読み込み関数 function func01(data){ var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("./count01.txt?r=" + randnum1); } //カウンター+1追加処理 jQuery('#btn01 p').click(function(e){ //「param1」変数の値と書き込みファイル名の情報をもってpost.phpへ。その後、関数func01を実行 jQuery.post("post.php" , {"param1": 'count01.txt'} , func01); jQuery("#btn01 span").load("./count01.txt"); }); });

  • ワンクリックしかできないクリックカウンター

    現在、ログイン式掲示板を作成中です。 その掲示板で、投稿に対してログイン中のみ、一人一回しかクリックできない「いいねボタン」のようなものを設置したいのですが、(mixiつぶやきのようなものです)どのようにすればよいのかわからずこまっております。 ネットにのっているものを参考にさせていただいて、クリック数をカウントする機能は、jQueryとjavascriptとphpでできたのですが、一回しかクリックできないようにするにはどうすればよいかわからないので、教えていただけませんか? どうぞよろしくお願いいたします。 javascript jQuery(document).ready(function(){ //初期時のカウンターファイル読み込み //同じファイル名だと正常に読み込めないので、ランダムな数字を生成し、パラメータとして付けることで、ユニークな状態にしている。 var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("./count01.txt?r=" + randnum1); //カウンター追加後の読み込み関数 function func01(data){ var randnum1 = Math.floor( Math.random() * 10000 ); jQuery("#btn01 span").load("./count01.txt?r=" + randnum1); } //カウンター+1追加処理 jQuery('#btn01 p').click(function(e){ //「param1」変数の値と書き込みファイル名の情報をもってpost.phpへ。その後、関数func01を実行 jQuery.post("post.php" , {"param1": 'count01.txt'} , func01); jQuery("#btn01 span").load("./count01.txt"); }); }); index.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>カウントサンプル</title> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/count.js"></script> </head> <body> <div id="btn01"><p><a href="javascript:void(0);">いいね!</a></p><span></span></div> </body> </html> post.php <?php $file = $_REQUEST['param1']; $c = file_get_contents($file); $c++; $fp = fopen($file, "r+"); @fputs($fp,$c); fclose($fp);

    • ベストアンサー
    • PHP
  • クリック数を1日ごとにカウントしたいです。

    どうか教えてください。 画像やボタンなどをクリックした時に、その(トータルの累計の)数を画像やボタンの横に表示する方法については、次のように「教えて!goo」にあります。 http://okwave.jp/qa/q6858457.html カウントサンプルページ http://olo.sakura.ne.jp/test/test.html これを累計の数ではなく、1日ごとにカウントするには、以下のコードをどのように変えたらよいでしょうか? 例えば、3月3日00:00~24:00の24時間以内にクリックされた数を表示し、3月4日00:00になったら、表示される数が「0」にもどるような場合を想定しています。 言い換えれば、(例えば)毎日00:00になったらカウント数がリフレッシュされるような表示方法です。 // カウンター読込み(表示) function load(n){  var uri = "count/count0" + n + ".txt?r=" + Math.floor(Math.random() * 10000);  jQuery("#btn0" + n + " span").load(uri); } // 初期表示+イベント設定 for(var n=0; ++n<3;){  load(n);  jQuery("#btn0" + n + " p").click(   (function(m){    return function(){     jQuery.post("count/post.php", {"param1":"count0" + m + ".txt"}, function(){load(m);});    };   })(n)  ); }

  • jqueryについて質問です。

    jqueryについて質問です。 ----------------------------------------------------------- test.js $(window).load(function() { $("body").load("a.php"); $("#btn").click(function() { alert();///動作しない } }); ----------------------------------------------------------- a.html <input type="button" id="btn" name="btn" value="send"> ----------------------------------------------------------- load先のidのクリックを監視するにはどうしたらいいのでしょうか?

  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • javascriptカウントダウン終了後別ページへ

    javascriptでカウントダウン終了後に別ページに飛ばすリンクを表示したいのですが、どのようにすれば教えていただけますでしょうか? 下記スクリプトではカウントダウン終了時に「終了しました」と表示されます。 その「終了しました」にリンクを貼りたいです。 <script language="JavaScript" type="text/javascript"> function CountdownTimer(elm,tl,mes){ this.initialize.apply(this,arguments); } CountdownTimer.prototype={ initialize:function(elm,tl,mes) { this.elem = document.getElementById(elm); this.tl = tl; this.mes = mes; },countDown:function(){ var timer=''; var today=new Date(); var day=Math.floor((this.tl-today)/(24*60*60*1000)); var hour=Math.floor(((this.tl-today)%(24*60*60*1000))/(60*60*1000)); var min=Math.floor(((this.tl-today)%(24*60*60*1000))/(60*1000))%60; var sec=Math.floor(((this.tl-today)%(24*60*60*1000))/1000)%60%60; var milli=Math.floor(((this.tl-today)%(24*60*60*1000))/10)%100; var me=this; if( ( this.tl - today ) > 0 ){ if (day) timer += '<span class="day">'+day+':</span>'; if (hour) timer += '<span class="hour">'+hour+':</span>'; timer += '<span class="min">'+this.addZero(min)+':</span><span class="sec">'+this.addZero(sec)+':</span><span class="milli">'+this.addZero(milli)+'</span>'; this.elem.innerHTML = timer; tid = setTimeout( function(){me.countDown();},10 ); }else{ this.elem.innerHTML = this.mes; return; } },addZero:function(num){ return ('0'+num).slice(-2); } } function CDT(){ var tl = new Date('2013/2/1 00:00:00'); var timer = new CountdownTimer('CDT',tl,'終了しました'); timer.countDown(); } window.onload=function(){ CDT(); } </script>

  • 複数の無名関数を合成したい

    javascriptにおいて、無名関数を合成する方法を知っている方はいらっしゃるでしょうか? var func1 = function(){     alert('func1'); } var func2 = function(){     alert('func2'); } この二つの関数を合成して、 var func3 = function(){     alert('func1');     alert('func2'); } という風に合成したいのです。 jQueryを利用して var func3 = $.extend(func1, $func2); と試しましたが、func3 == func1 となってしまうようです。 また、単純に、var func3 = func1 + func2; では、 func3 = function(){alert('func1');}function(){alert('func2');} と意味を成さないものになってしまいます。

  • jQueryのイベントに引数を渡したい

    例えば以下のような既存のJavaScriptのコードをjQueryのイベントで書き直したい場合、関数の引数で渡していた値は、どうやって渡すのでしょうか? 【html】 <a href="" onclick="func_a('abc'); return false;"></a> 【JavaScript】 faunction func_a(param_a){ alert(param_a); } 以下のようにすれば渡せないことはありませんが、かなり強引な感じがします。 【html】 <a href="" class="abc"></a> 【jQuery】 $(function() { $("a").click( function(){ var param = $(this).attr("class"); alert(param); return false; } ); }); こういう場合はjQeuryであっても、onclick属性で関数を呼び出すのが普通なのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願い申し上げます。

  • なぜundefinedになってしまうのでしょうか?

    乱数を配列にして、それを基準にしてランダムに処理を実行させたいのですが、 なぜかarrayRandomNum[0]がundefinedになります。 配列の始めのインデックスに当たる数値を取得できると考えていたのですがなぜundefinedになってしまうのでしょうか? let arrayRandomNum = [randomNumFunk(2)]; console.log(arrayRandomNum[0]); function randomNumFunk(count) { var generatedArray = []; var generatedCount = generatedArray.length; for(var i = 0 ; i < count; i++){ var candidate = Math.floor(Math.random() * count); for(var j = 0; j < generatedCount; j++) { if(candidate == generatedArray[j]){ candidate = Math.floor(Math.random() * count); j= -1; } } generatedArray[i] = candidate; generatedCount++; } return generatedArray; };

  • 要素名がスペースを含む場合のjQueryのセレクタ

    jQueryのセレクタで、"btn01 bi"という要素内のspanを 指定したいと思っています。 しかし、以下の書き方ではダメなようです。 $('.btn01 bi span').click(function(){ … スペースが含まれるからなのはわかりますが、この場合はどう書けば 良いのでしょうか? ご教授ください。

専門家に質問してみよう