jQueryのtoggle()を使ってチェックボックスのON/OFFでimgのclassを切り替える方法と、ボタンの反応が表示されない理由

このQ&Aのポイント
  • jQueryのtoggle()を使用して、チェックボックスのON/OFFでimgのclassを切り替える方法と、ボタンの反応が表示されない理由についてご教授ください。
  • 複数のチェックボックスと画像の組み合わせに対して、簡単にまとめる方法があるかどうか教えてください。
  • 合計で10個のボタンがあるため、これを複製せずにまとめる方法があるかどうかも教えてください。
回答を見る
  • ベストアンサー

jqueryについて

ただいま、jqueryのtoggle()を使って、 チェックボックスのON/OFFでimgのclassを切り替える(imgをクリックしてチェックボックスをON/OFFもできる)ということを しているのですが、なぜか、チェックボックスをクリックしても、 ボタンの反応はしているのですが、チェック(黒い「レ」)が表示されません。 以下、jsです。 ※チェックボックスと画像の組み合わせは複数あります。 $(function(){ $("li.p01").toggle( function(){ $("input.c01").attr("checked","checked"); $("li.p01").attr("class","p01on"); }, function(){ $("input.check01").removeAttr("checked"); $("li.p01on").attr("class","p01"); } ); $("input.check01").toggle( function(){ $("li.p01").attr("class","p01on"); }, function(){ $("li.p01on").attr("class","p01"); } ); $("li.p02").toggle( function(){ $("input.check02").attr("checked","checked"); $("li.p02").attr("class","p02on"); }, function(){ $("input.check02").removeAttr("checked"); $("li.p02on").attr("class","p02"); } ); $("input.check02").toggle( function(){ $("li.p02").attr("class","p02on"); }, function(){ $("li.p02on").attr("class","p02"); } ); }); ご教授お願いいたします。 また、ボタンが10個あるのですが、 このまま、複製していくのもどうかと思うんですが、 もっと簡単にまとめる方法などあるのでしょうか。 ご回答よろしくお願いいたします。

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

  • ベストアンサー
  • imq
  • ベストアンサー率72% (16/22)
回答No.1

サンプルはimgではなくliになっていますが、liの中にimgがある解釈でよろしいでしょうか。 inputとliでどちらをクリックしても同じ動作をさせるという意図でしたら、それぞれにtoggleメソッドを使うとおかしな動作になると思います(←liとinputを交互にクリックしたときのことを考えてください) 大体以下の方針で変更するといいと思います。 ・liの方はtoggleは使わず、clickメソッドを使う ・inputの方はchangeメソッドを使うのが筋。ただし、jsでchecked属性を変更したときはイベントが発生しない。 ・inputとliはそれぞれ共通のclassを持たせておく。 ・セレクタは共通のクラスで指定して、eachメソッドで回し、indexに対して個別の処理をさせる。 ・チェックボックス選択時にliのスタイルを変えたいときはclassを追加する。 ・classの部分追加・削除はattrよりもaddClass、removeClassを使う方がスマート。 ・更に今回はtoggleClassを使う方がいいです。 ・checked属性の追加・削除ではなく、属性値をブールで設定する。 ・同一のjQueryオブジェクトを何度も使用するときは、初めに変数に代入しておいた方がスマート。 <script type="text/javascript"> //<![CDATA[ $(function(){ var $p = $("li.p"); var $c = $("input.c"); $p.each(function(i) { //eachメソッドのコールバック関数の第一引数はindex $(this).click(function() { $c.eq(i).attr("checked", !$c.eq(i).attr("checked")); $(this).toggleClass("p-on"); }); }); $c.each(function(i) { $(this).change(function() { $p.eq(i).toggleClass("p-on"); }); }); }); //]]> </script> <ul> <li class="p"><img src="…" /></li> <li class="p"><img src="…" /></li> … </ul> <input class="c" type="checkbox" /> <input class="c" type="checkbox" /> …

trfnc223
質問者

お礼

ありがとうございました! toggle()の意味をちゃんと理解してませんでした! 参考にしてみます!

関連するQ&A

  • (jQuery)同じクラス名のオブジェクトを一斉操

    jQueryで同じクラス名のオブジェクトを一斉操作するにはどうしたら良いでしょうか? 【したいこと】 3つのチェックボックスのいずれかにチェックを入れると disabledである「お問合わせ」と「お申込み」ボタンがクリックできるようにしたいです。 1つでもチェックが入っていなければボタンはdisabledにしたいです。 【現状】 3つのチェックボックスの1番上のclass="foo"のみクリックすると動作します。 ▼【 HTML 】 <input type="checkbox" class="foo"> <input type="checkbox" class="foo"> <input type="checkbox" class="foo"> <input type="submit" class="bar" value="お問合わせ"> <input type="submit" class="bar" value="お申込み"> ▼【 jQuery 】 // アクセス時はボタンは無効にする。 $(document).ready(function(){   $('.bar').attr('disabled', true); }); // チェックボックスクリックアクション $('.foo').click(function() {   $('.bar').each(function() {     if($('.foo').prop('checked') == true) {       $('.bar').attr('disabled', false);     } else {       $('.bar').attr('disabled', true);     }   }); }); ご教授の程どうぞ宜しくお願い致しますm(__)m

  • jqeryについて

    [script] $(function() { $(".btn").on('click',function(){ Tmp=$(this).attr('id').replace('button','p'); $(".box").hide(); $("#"+Tmp).show(); }); }); [css] .box{ display:none; } [html] <p id="p1" class="box">テスト1</p> <p id="p2" class="box">テスト2</p> <p id="p3" class="box">テスト3</p> <input type="button" id="button1" value="ボタン1" class="btn" /> <input type="button" id="button2" value="ボタン2" class="btn" /> <input type="button" id="button3" value="ボタン3" class="btn" /> 上記のコードのボタン部分、表示部分を変えたいのですがうまくいかないので教ええてください。 <input type="button" id="button1" value="ボタン1" class="btn" />ここの部分を<p id="tab1 class="tab">に変更し、 <p id="p1" class="box">テスト1</p> ここの部分を <div class="">(cssでアイテム(ul)全体を右に寄せています。) <ul> <a href="/"><li><img src="hoge/hoge1.png"><p>hogehoge</p></li></a> <a href="/"><li><img src="hoge/hoge2.png"><p>hoge</p></li></a> </ul> </div> よろしくお願いします。

  • jQueryでの画像切り替え処理について

    前回の質問の続きになります。 一列に配置したボタンを、マウスオーバー時、クリック時にそれぞれ別の画像に切り替えたいと思っています。 (元画像A_offを、マウスオーバー時はA_on、クリック時はA_off_s3へと変更する。  A_off_s3の状態でマウスオーバーされた場合、A_offにはならず、A_off_s3のままとする。  A_off_s3が表示されている時に他のボタンB_offがクリックされたら、B_offはB_off_s3を、A_off_s3はA_offを表示する。) 色々なページを参考に、以下のようなスクリプトを書きました。 ---------- <head> <script type="text/javascript" src="script/jquery-1.11.0.min.js"></script> <script> $(function(){ var handler = $('ul#nav li a'); var url = document.URL; var urlId = url.substr(url.lastIndexOf('#')); var urlIdJudgment = urlId.lastIndexOf('#'); $('ul#nav').each(function(){ $('#tab-box > div:first').show(); var imgSrc = $('ul#nav li:first img').attr('src'); var imgDot = imgSrc.lastIndexOf('.'); var onSrc = imgSrc.substr(0, imgDot) + '_s3' + imgSrc.substr(imgDot, 4); $('ul#nav li:first img').attr('src',onSrc).addClass('tab-on'); }); handler.click(function() { var imgSrc = $(this).children('img').attr('src').replace(/_s3/g, ""); var imgDot = imgSrc.lastIndexOf('.'); var onSrc = imgSrc.substr(0, imgDot) + '_s3' + imgSrc.substr(imgDot, 4); $(this).children('img').attr('src',onSrc); var imgOff = $('ul#nav li img.tab-on').attr('src').replace(/_s3/g, ""); $('ul#nav li img.tab-on').attr('src',imgOff); $('ul#nav li img').removeClass('tab-on'); $(this).children('img').addClass('tab-on'); var imgSrc = $(this).children('img').attr('src').replace(/_s3/g, ""); var imgDot = imgSrc.lastIndexOf('.'); var onSrc = imgSrc.substr(0, imgDot) + '_s3' + imgSrc.substr(imgDot, 4); $(this).children('img').attr('src',onSrc); return false; }) }); $(function(){ $('a img').hover(function(){ $(this).attr('src', $(this).attr('src').replace('_off', '_on')); }, function(){ if (!$(this).hasClass('currentPage')) { $(this).attr('src', $(this).attr('src').replace('_on', '_off')); } }); }); </script> </head> <body onload="MM_preloadImages('img/A_off.jpg','img/A_on.jpg','img/A_off_s3.jpg','img/B_off.jpg','img/B_on.jpg','img/B_off_s3.jpg','img/C_off.jpg','img/C_on.jpg','img/C_off_s3.jpg')"> <div id="tab-box"> <ul id="nav" class="clearFix"> <li><a href="xxx"><img src="img/A_off.jpg" width="134" height="36" alt="" id="A" /></a></li> <li><a href="yyy"><img src="img/B_off.jpg" width="134" height="36" alt="" id="B" /></a></li> <li><a href="zzz"><img src="img/C_off.jpg" width="134" height="36" alt="" id="C" /></a></li> </ul> </div> ---------- 上記のスクリプトで実行をすると、クリック時に?マークが表示され、カーソルが離れると○_off_s3の画像が表示されます。 また、○_off_s3の画像が表示されている時に、○_off_s3にカーソルを合わせると、?マークが表示され、カーソルが離れると○_off_s3が表示されます。 また、○_off_s3の名称をわかりやすいものにしようと思い、○_off_cに変更し、スクリプトの"_s3"を”_c”に変更したところ、スクリプトが正常に実行されなかったのも気になっています。 原因がわかる方がいらっしゃれば、アドバイスをお願いいたします。

  • JQueryを使ってcssを書き換え

    何となくコードを見てさわる程度の初心者です。 以下のようなソースを組みました。 <div id="slide"> <a href="01.htm"><img src="01.jpg" alt="01" id="alttxt" /></a> </div> <div id="slidenavi"> <ul> <li><a href="01.html"><img src="s_01.jpg" alt="01" class="b_01.jpg" /></a><span class="active"></span></li> <li><a href="02.htm"><img src="s_02.jpg" alt="02" class="b_02.jpg" /></a><span class="active"></span></li> <li><a href="03.html"><img src="s_03.jpg" alt="03" class="b_03.jpg" /></a><span class="active"></span></li> </ul> </div> #slideがメインエリアで、#slidenaviがメインエリアの画像とリンク先を切り替えるナビゲーションボタンになっています。 ナビに連動したメインエリア用の画像ファイル名は #slidenavi の img の classに入れておいて、それを読み込んで代入するというおかしなやり方で呼び出していますが、ここまではうまくいきました。 問題はここからです。 最初の状態では<span class="active"></span>はcssの設定でdisplay: noneとしてあります。 そして#slidenaviのボタンにマウスが乗ると、その部分の<span class="active"></span>をdisplay: blockとして表示したいのですが、これがどうしてもうまくいきません。 この部分も含めて、おかしな書き方になっている部分があれば教えてもらえないでしょうか。 jsファイルは以下の通りです。 $(function(){ $('#slidenavi ul li a').fadeTo(0,0.4); $('#slidenavi ul li a').hover(function(){ $(this).fadeTo(300,1.0); }, function(){ $(this).fadeTo(300,0.4); }) $('#slidenavi ul li img').mouseover(function(){ var bglink = $(this).attr("class"); var altTxt = $(this).attr("alt"); $("#slide img").attr("src","images/home/main/"+bglink); $("#slide img").attr("alt",altTxt); $("#slide span.active").css("display","block"); }); $('#slidenavi ul li a').mouseover(function(){ var Href = $(this).attr('href'); var Tget = $(this).attr('target'); $("#slide a").attr("href", Href); $("#slide a").attr("target", Tget); $("#slide a").click(function() { window.open(Href,'_self'); return false; }); }); });

  • jQueryでフォームの変更時、チェックする

    jQuery初心者です。 指定したクラス(例はclass_a)のフォームがchangeされた時に 指定したクラス(例はa_check)のチェックボックスをチェックするようにしたいのですが 上手くいきません。動作はするのですが、ページ読み込み時に勝手に checkedしてないのにチェックがONになります。どうすればいいでしょうか・・? 初期値の有無は関係無いみたいです <form method="get" action=""> <input type="checkbox" class="a_check" name="mode" value="1" >チェックボックス<br> <input type="text" size="30" class="class_a" name="input_a" value="">テキスト<br> </form> <script type="text/javascript"> $(".class_a").change(function () { $(".a_check").attr("checked", true); }).change(); </script> ご指南頂けたら幸いです。

  • シャドウボックスとjQueryを共存させるには

    シャドウボックス3.0.3を利用しています。 チェックボックスを複数選択するjQueryをシャドウボックス内で利用したいのですが、 シャドウボックスとjQueryがコンフリクトしてしまうようで、実現できません。 共存させるにはどのように記述を変えれば良いでしょうか? <head> <script type="text/javascript" src="../common/js/jquery-1.3.1.min.js"></script> <!-- シャドウボックス --> <script type="text/javascript" src="../common/js/shadowbox/shadowbox.js"></script> <link rel="stylesheet" type="text/css" href="../common/js/shadowbox/shadowbox.css"> <script type="text/javascript"> $(document).ready(function(){ Shadowbox.init(); }); </script> <!-- チェックボックスの複数選択 --> <script type="text/javascript"> $(function(){ $("#toggle").click(function(){ $('.chkbox').attr('checked', $(this).attr('checked')); }); }); </script> </head> <body> <a href="#inline" title="シャドウボックス" rel="shadowbox;width=900;height=1200">シャドウボックス</a> <div id="inline" style="display:none"> <input type="checkbox" id="toggle"> toggle<br> <br> <input class="chkbox" type="checkbox" name="ids[]" value="1"> 1<br> <input class="chkbox" type="checkbox" name="ids[]" value="2"> 2<br> <input class="chkbox" type="checkbox" name="ids[]" value="3"> 3<br> </div> </body>

  • $(this)を変数に入れないと動作しない理由

    「WebデザイナーのためのjQuery入門」という書籍でjQueryの勉強をしています。 リンク先 http://gihyo.jp/book/2012/978-4-7741-4856-4 この書籍の中のロールオーバーボタンのスクリプトで質問があります。 以下のスクリプトは書籍に載っているスクリプトですが、これにより画像ボタンにポインタがのる・のらないでボタン画像が切り替わります。 --------------- $(function(){ $('.rollover').each(function(){ var a = $(this); var img = a.find('img'); var src_off = img.attr('src'); var src_on = src_off.replace('_off','_on'); $('<img />').attr('src','src_on'); a.hover(function(){ img.attr('src',src_on); },function(){ img.attr('src',src_off); }); }); }); --------------- htmlは以下になります。※<body>内のみ抜粋 --------------- <body> <div class="header"> <ul class="menu"> <li><a href="index.html" class="rollover"><img src="menu01_off.png" alt="Home"></a></li> <li><a href="index.html" class="rollover"><img src="menu02_off.png" alt="Products"></a></li> <li><a href="index.html" class="rollover"><img src="menu03_off.png" alt="Company"></a></li> </ul> </div> </body> --------------- 質問したいのは、スクリプトの上から3行目の「var a = $(this);」です。 var a = $(this); var img = a.find('img'); 上記を、 var img = $(this).find('img'); とした場合、なぜか画像が切り替わりません。 どちらも同じような気がするのですが、不具合の原因が分かりません。 お分かりの方がいっらしゃいましたら、お手数ですがご回答よろしくお願いいたします。

  • jqueryの質問。

    毎回、お世話になります。 jqueryを使ってリンク文字をクリックすると画像が変更できるようにしたいのですが、 上手くいきません。 <HTML> <body> <ul> <li><a href="DSC_0014.jpg">a</a></li> <li><a href="kamen.jpg">b</a></li> <li><a href="irumi.jpg">c</a></li> </ul> <p><img src="DSC_0014.jpg" width="1000" height="671"> <SCRIPT> $(function(){ ("a:eq(0)").click(function(){ $("img").attr("src","DSC_0014.jpg").attr("alt","人物"); return false }); $("a:eq(1)").click(function(){ $("img").attr("src","kamen.jpg").attr("alt","仮面"); return false }); $("a:eq(2)").click(function(){ $("img").attr("src","irumi.jpg").attr("alt","イルミ"); return false }); }); このコードだとリストa,b,cをクリックすると別ページに画像が表示されます。 その場での画像切り替えをしたいのですが、どこが間違っているのでしょうか? 宜しくお願い致します。

  • チェックが入っていなかったら処理を行いたい

    いつもお世話になっております。 只今チェックボックスにチェックが入っていなかったらチェックを入れるという処理を Javascript、JQueryで行いたいのですが上手く動作せずに困っております。 if ( $( 'input:checkbox[name="tax_input[pick-up][]"]' ).is( 'checked' ) == false ) { jQuery('input:checkbox[name="tax_input[pick-up][]"]').removeAttr ( 'checked' ); jQuery('input:checkbox[name="tax_input[pick-up][]"]:eq(3)').attr ( 'checked', 'checked' ); } 上記のソースで試したのですが反応が全くありませんでした。 if( $( 'input:checkbox[value="98"]' ).is( ':checked' ) ) { jQuery('input:checkbox[name="tax_input[pick-up][]"]').removeAttr ( 'checked' ); jQuery('input:checkbox[name="tax_input[pick-up][]"]:eq(2)').attr ( 'checked', 'checked' ); } チェックが入っている場合の判定ですが上記の場合は動きました。 記述ミス、根本的に書き方が違うなどございましたらご指摘ください。 ご回答のほどどうぞよろしくお願い致します。

  • jqueryを使ってポップアップを作ろうとしています。

    jqueryを使ってポップアップを作ろうとしています。 アイコンにマウスオーバーでポップアップ表示、ポップアップの×をクリックしてポップアップ削除という動きまではできています。 しかしマウスオーバーのアイコンはul liの中にあるのに、ポップアップはulの外に置かれているため、thisが使えず、アイコンにマウスオーバーすると全てのポップアップが表示されてしまいます。 これをマスウオーバーしたアイコンのポップアップのみ表示できるようにしたいです。 下記にソースになります。表示させたいのはアイコン02にカーソルを合わせた場合のみになります。 よろしくお願いいたします。 JS ---------------------------------------------------------------- $(function(){ $(".popup").hide(); $(".box ul li.icon02").mouseover(function(){ $(".popup").fadeIn("fast").css({ top:10+"px", left:-95+"px"}); }); $(".popup img.closed").click(function(){ $(".popup").fadeOut("fast"); }); }); html ---------------------------------------------------------------- <div class="box"> <div class="boxIn"> <ul> <li class="ico01"><a href="#"><img src="アイコン1url" /></a></li> <li class="ico02"><a href="#"><img src="アイコン2url" /></a></li> <li class="ico03"><a href="#"><img src="アイコン3url" /></a></li> </ul> <!--▼pop-up部分--> <div class="popup"> <p>●●<img src="クローズボタンurl" alt="close" width="12" height="12" class="closed" /> </p> <div class="popInner"> <p>ポップアップの中身</p> <!--#popInner--> </div> <!--#popup--> </div> <!--▲pop-up部分ここまで--> <!--#boxIn--> </div> <!--#box--> </div> 以下 <div class="box"> ~~同じ構成要素の繰り返し。

専門家に質問してみよう