• ベストアンサー

jQuery の each を使いたいのですが。。

$(document).ready(function() {  $("#anchor1").click(function(event) {   $("#anchor1").addClass('style1');   $("#anchor2").removeClass('style1');   $("#anchor3").removeClass('style1');  })  $("#anchor2").click(function(event) {   $("#anchor1").removeClass('style1');   $("#anchor2").addClass('style1');   $("#anchor3").removeClass('style1');  })  ・  ・  ・ }); ※全角スペースいれてます。 上記のような処理をeachなどで楽に書きたいのですが、 どなたか教えていただけると助かります。。 クリックしたとこにstyle1が追加、後はスタイル無しに、という処理です。

  • tkmkok
  • お礼率87% (128/146)

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

IDではなくクラス(class="anchor")を付けておくのはどう? $('.anchor').click(function(){  $('.anchor').removeClass('style1'); //全部からクラスを削除  $(this).addClass('style1'); //クリックされた要素にクラスを追加 });

tkmkok
質問者

お礼

ありがとうございます。 なるほど、発想の転換ですね。 確かにいけました! 行数も少なく、シンプルです。

その他の回答 (2)

  • MrYoYoYo
  • ベストアンサー率33% (38/115)
回答No.3

すでに回答済みですが、アドバイスを。 $(document).ready(function(){ var idAry = [ "anchor1", "anchor2", "anchor3", "anchor4", "anchor5" ]; var styleAry = { anchor1:'test1', anchor2:'test2', anchor3:'test3', anchor4:'test4', anchor5:'test5' }; $.each(idAry, function() { var Obj = $('#' + this); Obj.text('配列の値が引き渡される'); Obj.addClass(styleAry[this]); }); }); 指定したいエレメントに法則性がない場合は、 配列がオブジェクトで指定する事もできます。

tkmkok
質問者

お礼

eachのサンプルありがとうございます。 スタイルがtest1~test5までありますが、 今回の場合はスタイルは1種類で、 クリックした箇所に適用、後は削除という形をとりたいのです。 <ul> <li id='#anchor1' class='style1'><a href='link'>あああ</a></li> <li id='#anchor2'><a href='link'>いいい</a></li> <li id='#anchor3'><a href='link'>ううう</a></li> </ul> というようなもので、class='style1'がクリックした先に適用という感じです。

noname#87714
noname#87714
回答No.2

こういう場合、全部の要素のクラスを変える必要はありませんよね。 全部の要素に共通のクラス class1 を一つ用意して、スタイルを変えるためのクラス class2 をもう一つ用意したら、 .class1 { /* class1のものに付けるスタイル */ } .class1.class2 { /* class1かつclass2のものに付けるスタイル */ } とすればいいですから。 そう考えると、質問の部分は、 $(document).ready(function() {  $('.class1').click(function(event) {   $('.class2').removeClass('class2');   $(this).addClass('class2');  }) }); // まずclass2が付いている要素からclass2を外し、 // 次にクリックした要素に対してclass2を付ける。 こんな感じになりますかね。jQuery使ったことないんですが、感覚では「こんな感じ」です。

tkmkok
質問者

お礼

ありがとうございます。 steel_grayさんと同じ考え方ですね。 どうやらまわりくどく考えていたようです。。 いったんまとめてremoveClassしちゃえばよかったんですね。。 勉強になります。

関連するQ&A

  • jQueryで6行表示のループ

    大雑把な質問なのですが、自分でもわかっているのですが、 もっと簡単なやり方がないものかと色々とやっていたのですが、 ありませんでしょうか? $(document).ready(function() { var nCnt2 = 1; var nMax2 = 6; if(nMax2 < $('ul#portfolio li').length) { $('ul#portfolio li').hide('fast').addClass('hidden'); $('ul#portfolio li.hidden').hide('fast').addClass('hidden'); $('ul#portfolio li.hidden').each(function() { if(nCnt2 <= nMax2) { $(this).fadeIn('slow').removeClass('hidden'); } nCnt2++; }); } $('ul#navi a').click(function() { $(this).css('outline','none'); $('ul#navi .all').removeClass('current'); $(this).parent().addClass('current'); var filterVal = $(this).text().toLowerCase().replace(' ','-'); var nCnt = 1; var nMax = 6; if(filterVal == 'all') { $('ul#portfolio li').hide('fast').addClass('hidden'); $('ul#portfolio li.hidden').hide('fast').addClass('hidden'); $('ul#portfolio li.hidden').each(function() { if(nCnt <= nMax) { $(this).fadeIn('slow').removeClass('hidden'); } nCnt++; }); } else { $('ul#portfolio li').hide('fast').addClass('hidden'); $('ul#portfolio li').each(function() { if(!$(this).hasClass(filterVal)) { $(this).fadeOut('normal').addClass('hidden'); } else if (nCnt <= nMax) { $(this).fadeIn('slow').removeClass('hidden'); nCnt++; } }); } return false; }); });

  • jqueryにてIEでの不具合 each処理?

    cromeやfirefoxでは正常に動きますが、IEにて一部動いてくれない部分があり困っています。 おかしな点や原因など教えていただきたくご質問させていただきます。 <style> .that{color:red;} </style> <script type="text/javascript"> $(function(){ $('button').click(function(){ $('#list>ul').removeClass('that'); var val = $(this).text(); $('#list>ul li').each(function(){ if($(this).text() == val){ $(this).parent().addClass('that'); }; }); }); }); </script> html↓ <button>100</button> <button>200</button> <button>300</button> <div id="list"> <ul> <li>100</li><li>200</li> </ul> <ul> <li>300</li><li>200</li> </ul> </div> クリックしたボタンの数値があるULの色を変えるものです。 100と300をクリックした場合は正常に変わりますが、200をクリックした時に変わらなくなります。 <li>の中で最後に書かれている数値が効かなくなるようで、<li>の100と200を入れ替えると100が効かなくなります。(IEのみ) 原因等わかりましたらよろしくお願いいたします。

  • jQueryの $(function(){ });

    jQueryについて基本的な質問をさせてください。 基本的にjQueryは、お約束として $(document).ready(function(){ }); と記述し、その中に実行処理を書いていくと思うのですが loadを待たずに実行させたい時は $(document).ready(function(){ });は記述しなくてもよいのでしょうか? どの本をみてもjQueryのお約束事みたいに $(document).ready(function(){ }); を必ず書くと載っています。 自分でやってみたところ、記述しないでも問題なく動いているのですが、 やっぱり $(document).ready(function(){ }); を記述しないと、何か問題があるのでしょうか? ご存知の方、教えてください。 どうぞ宜しくお願いたします。

  • offset().topでIE6エラー

    以下のjs(jquery)を実行すると IE6でエラーになります。 どうもoffset().topが引っかかているようですが、 対策がわかりません。 $(document).ready(function() { $(".test li").click(function(){ $(".test li").removeClass("hide");   $("div.box .orn").removeClass("active");   $('div#' + $(this).attr('id')).addClass("active");   $('.scroll').animate({ scrollTop: $('div#' + $(this).attr('id')).offset().top }); }) }) どなたか教えていただけると助かります。

  • jQueryのアコーディオンメニューについて

    下記デモページを参考に同じアコーディオンのメニューを設置したのですが、 デモ http://www.queness.com/resources/html/accordion/index.html 上記サイトのクリックするバーを下記参考サイトの「カテゴリで探す」箇所のように 再度クリックして閉じるようにしたいです。 http://ccm.stylestore.allabout.co.jp/mojo?language=ja 下記スクリプトのどの部分をいじればいいのか、 どなたかお分かりの方がございましたらご教授頂けませんでしょうか。 ■javascript $(document).ready(function () { $('#accordion li').click(function () { //slideup or hide all the Submenu $('#accordion li').children('ul').slideUp('fast'); //remove all the "Over" class, so that the arrow reset to default $('#accordion li > a').each(function () { if ($(this).attr('rel')!='') { $(this).removeClass($(this).attr('rel') + 'Over'); } }); //show the selected submenu $(this).children('ul').slideDown('fast'); //add "Over" class, so that the arrow pointing down $(this).children('a').addClass($(this).children('li a').attr('rel') + 'Over'); }); }); 宜しくお願い致します。

  • jQuery JavaScript

    初めての質問ですがよろしくお願いします。 とあるシステムをphp+jQueryで開発しています。 <div class="item1" id="item1">アイテム名</div> このdviがクリックされた時に、 $(document).ready(function() { $('div[class^="item"]').mouseover(function(ev) { $(this).css('cursor', 'pointer'); }).click(function(ev) { // **この部分** // }); }); クリックイベント内でクリックされたclassNameかid名を取得する (この場合は item1 を文字列として取得したい) にはどうしたらよいのでしょうか?

  • 【jQuery】要素が消えずに困っています。

    jQuery の FullCalendar をカスタマイズしているのですが、 要素が消えずに困っています。 【希望】 カレンダー内のイベントをクリックすると、 ポップアップみたいに、詳細を表示。 ポップアップ以外をクリックで、ポップアップの非表示。 【現状】 ポップアップの表示まではできています。 カレンダー内のイベントのない日付をクリックするとポップアップは消えますが、 ポップアップが出てる状態で、カレンダー外の部分をクリックすると、 ポップアップがカーソルの場所で再表示されてしまいます。 色々調べて試してみたのですが、ちょっと分からず、 どなたかご教示いただけませんでしょうか。 よろしくお願い致します。 ソース記載します。 $(document).ready(function() { $('body').append('<div class="tooltiptopicevent" style="background-color:#eeeeee; position:absolute; z-index:10000; padding: 10px; line-height: 200%;">details</div>'); $('body').click(function(e) { $('.tooltiptopicevent').css('top', e.pageY + 10); $('.tooltiptopicevent').css('left', e.pageX + 20); }); $('.tooltiptopicevent').hide(); $('#calendar').fullCalendar({ editable: true, googleCalendarApiKey: 'hogehogehogegehogegehoge', eventSources: [ { googleCalendarId: 'hogehogehogegehogegehoge@group.calendar.google.com', className: 'calendar_1' } ], eventClick: function (data, event, view) { $('.tooltiptopicevent').html('イベント名 ' + ': ' + data.title + '</br>' + '詳細 ' + ': ' + [data.description,""][1*(data.description==undefined)]); $('.tooltiptopicevent').show(); }, dayClick: function (data, event, view) { $('.tooltiptopicevent').hide(); }, }); });

  • JQueryがChromeで動くがIEで動かない

    JQueryで書いた単純なJavaScriptが IEで動かず困っています。 Firefoxでも動いており F12のデバッガを使ったとき、 Chromeと、Firefoxはデバッグポイントでストップするのですが、 IEだけ、そもそもFunctionの中に入ってきません。 $(function(){ //do something }); ちなみに、documentのreadyや、ドロップダウンリストボックスのchangeのイベントです。 お知恵をお借りできませんでしょうか? 宜しくお願い致します。

  • .eachファンクションは各繰り返し処理で実行した

    .eachファンクションは各繰り返し処理で実行したい関数を指定します。 http://js.studio-kingdom.com/jquery/traversing/each ということですが、クリックを繰り返すと色が変わったり戻ったりという、 繰り返し処理をしたい時に使うメソッドなのでしょうか? JSです。

  • フォントサイズの変更

    jqueryを使用したフォントサイズの変更について質問です。 サイズの変更は以下のスクリプトで動作するのですがクラス名(active)が付与されずうまく動作しません。 html <ul class="switch"> <li><span class="fontChangeSmall">小</span></li> <li><span class="fontChangeNormal">中</span></li> <li><span class="fontChangeLarge">大</span></li> </ul> font-change.js $(document).ready(function() { var bodyClass = 'font'; var switchClass = 'fontChange'; var startClass = 'Normal'; var activeClass = 'active'; var value = $.cookie('fontSize'); if ( value ) { $('body').addClass(bodyClass + value); $('.switch .' + switchClass + value).addClass(activeClass); } else { $('body').addClass(bodyClass + startClass); $('.switch .' + switchClass + startClass).addClass(activeClass); } $('.switch span').click( function() { value = $(this).attr('class').replace(switchClass, ''); $('body').removeClass(bodyClass + 'Normal').removeClass(bodyClass + 'Small').removeClass(bodyClass + 'Large'); $('body').addClass(bodyClass + value); $('.switch span').removeClass(activeClass); $('.switch .' + switchClass + value).addClass(activeClass); $.cookie('fontSize', value); }); }); 上記だけであれば動作するのですが下記のスクリプトがあるとactiveが付与されない状況です。 下記をコメントすると正常に動作します。 ※どちらのjsも外部ファイルとして読込みしてます。 common.js $(function() { $('body :first-child').addClass('firstChild'); $('body :last-child').addClass('lastChild'); }); どのようにすればactiveが付与されるようになりますでしょうか?

専門家に質問してみよう