JQueryによるclass名での背景切り替え

このQ&Aのポイント
  • class名を指定した背景切り替えでおかしな挙動が出る理由について質問します。
  • id名のときは正常に切り替えが行われるが、class名のときはおかしくなる。
  • クラス名の変更が原因かどうか知りたいです。
回答を見る
  • ベストアンサー

JQueryによるclass名での背景切り替え

下記ソースでおかしな挙動がでているので質問させて頂きます。 jQuery導入済みで2つのブロックの背景に同じクラス名を指定した上で背景を一定時間ごとに切り替えているのですが、指定していたクラスタをid名からclass名に変えただけで切り替えがおかしくなりました。 id名のとき 00→01→00→01→00→01→…… class名のとき 00→01→00→00→01→01→01→01→…… クラス名にしたことが原因でしょうか? function testBack(obj){ var t = '.changeBg'; if (obj>3){obj=0;} $(t).fadeIn(1000).css('background','url('bg_0'+ obj +'.jpg) center top no-repeat'); obj++; $(t).delay(8000).fadeOut(1000,function(){ setTimeout('testBack('+obj+')', 100); }); } $(document).ready(function(){ if ($('body').attr('class') != 'testBox'){ testBack(0); var img=new Array(); img[0]=new Image(); img[0].src= rootPath+'commons/images/bg_00.jpg'; img[1]=new Image(); img[1].src= rootPath+'commons/images/bg_01.jpg'; } });

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

「2つのブロックの背景に同じクラス名を指定した」ということは、最初のtestBack(0)の呼び出しでは、その処理の中の --- $(t).delay(8000).fadeOut(1000,function(){ setTimeout('testBack('+obj+')', 100); }); --- ここでは、二つのブロックそれぞれについて、 「8秒待って、1秒フェードアウトして、それが終わったらsetTimeout('testBack(1)',100)を実行」という処理を行うことになります。 つまり、9.1秒後には「testBack(1)」が2回呼び出されてしまうのです。 そうすると、その次は、2回の「testBack(1)」の処理の中で、それぞれ2回、setTimeOut('testBack(2)',100)が処理されますから、 さらに9.1秒後には、「testBack(1)」が4回呼び出され、さらに9.1秒後は testBack(2)が8回、…とtestBackの呼び出しがどんどん増殖していくことになってしまいます。 対策としては、クラス指定はやめてid指定にし、一つのtestBackが一つのtimeOutしか呼び出さないようにする、というのが確実でしょう。 ただし、testBackをidごとに2つ用意する必要はありません。 --- function testBack(t,obj){ if (obj>3){obj=0;} $(t).fadeIn(1000).css('background','url('bg_0'+ obj +'.jpg) center top no-repeat'); obj++; $(t).delay(8000).fadeOut(1000,function(){ setTimeout('testBack("'+t+'",'+obj+')', 100); }); } --- のように、testBackの引数にセレクタも指定するようにしておいて、 あとは最初のtestBack呼び出しを testBack("#changeBg1", 0); testBack("#changeBg2", 0); の2行にすれば、9.1秒後には「testBack("#changeBg1",1)」と「testBack("#changeBg2",1)」が実行され、次の9.1秒後には「testBack("#changeBg1",2)」と「testBack("#changeBg2",2)」が実行され、…ということになり、 testBackの呼び出しが増殖することはなくなります。

picicate
質問者

お礼

大変ありがとうございました! 最初eachでも使うのかとかなり長いこと悩んでいたので別々に指定すればいいというのを完全に忘れておりました; 参考にさせていただきます!

関連するQ&A

  • サムネイル画像のclass切替がうまく動かない。

    すみません、jquery初心者です。 下記の様にサムネイルをクリックすると、mainの画像が切り替わる画像ギャラリーを作成しておりまして、 サムネイルをクリックして class="current" を切り替えたいのですが、うまく動きません。 別のサムネイルをクリックすると、最初のclassはremoveされるのですが、 クリックしたサムネイルにclassを付けたいのですが効きません。。 $(document).ready(function() { $(function(){ $('#sum li a').click(function(){ var h = $(this).eq(0).attr('rel'); $('#main img').fadeOut(function(){ ($('#main img').attr("src",h)).fadeIn(); $('#sum li a').removeClass('current'); $(this).addClass('current'); }); return false; }) }); }); <div class="main_area"> <p id="main"><img src="images/img01.jpg" /></p> </div> <ul id="sum" class="clearfix"> <li><a href="#" rel="img01.jpg" class="current"><img src="images/sum01.jpg" /></a></li> <li><a href="#" rel="img02.jpg"><img src="images/sum02.jpg" /></a></li> <li><a href="#" rel="img03.jpg"><img src="images/sum03.jpg" /></a></li> </ul> ご教授頂けると非常に助かります。 よろしくお願いします。

  • 次のJSで同じ変数名

    swichをを繰り返し書きたくないのですが C言語の#defineといったような機能はJSにはないのでしょうか? "off.jpg"も2箇所で使われていますがこれについてもメンテのために一箇所に指定のですがこちらも定義できるでしょうか? <script language="JavaScript"> var on=new Image(); var off=new Image(); on.src="on.jpg"; off.src="off.jpg"; function tooff(img) { if(img=="swich")document.images[img].src=off.src; } function toon(img) { if(img=="swich")document.images[img].src=on.src; } </script> <a href="gomi.htm" onmouseout="tooff('swich')" onmouseover="toon('swich')"> <img src="off.jpg" name="swich" width="99" height="99"/> </a>

  • jquery1.4で画像とリンクの切り替えを行おうとしています。

    jquery1.4で画像とリンクの切り替えを行おうとしています。 ひとまず動き的にはうまくは行っているのですが、切り替え対象の複数の画像をfloat:left;等で 横並びにすると、切り替えるたい画像をクリック後に規定の場所に画面が移動してしまいます。 対処法があれば教えていただけますでしょうか? 【javascript】 $(document).ready( function() { $(".thumbnail p").click( function() { var changeSrc = this.src; var changeHref = this.href; $("#target img").fadeOut("fast", function() { $(this).attr("src", changeSrc); $(this).fadeIn(); } ); $("#target a").attr("href", changeHref); }); $(".thumbnail2 img").click( function() { var changeSrc = this.src; $("#target2").fadeOut( "slow", function() { $(this).attr("src", changeSrc); $(this).fadeIn(); } ); }); $(".thumbnail3 img").click( function() { var changeSrc = this.src; $("#target3").slideUp( "slow", function() { $(this).attr("src", changeSrc); $(this).slideDown(); } ); }); }); </script> 【HTML】 <div> <p id="target"><a href="./main.cgi?mode=details2&sid=1&gid=1S000046"><img src="./g_images/IMG_1457.jpg" width="240" height="320" alt="ブランドカテゴリー" /></a></p> </div> <div class="thumbnail"> <p href="./main.cgi?mode=details2&sid=1&gid=1S000043" src="./g_images/IMG_1457.jpg" class="item"> <img src="./g_images/IMG_1457.jpg" width="90" height="150" alt="ブランドカテゴリー" /> <br /><a href="./main.cgi?mode=details2&sid=1&gid=1S000043">詳細</a></p> <p href="./main.cgi?mode=details2&sid=1&gid=1S000047" src="./g_images/IMG_1469.jpg" class="item"> <img src="./g_images/IMG_1469.jpg" width="90" height="150" alt="ブランドカテゴリー" /> <br /><a href="./main.cgi?mode=details2&sid=1&gid=1S000047">詳細</a></p> </div> 【css】 .thumbnail { height:200px; text-align:center; } .item { float:left; padding-left:10px; margin-left:10px; }

  • jqueryについて(v 1.4.2)

    jqueryについて(v 1.4.2) <script type="text/javascript"> $(function() { $("h1").append('<em></em>') $(".thumbs a").click(function() { var largePath = $(this).attr("href"); var largeAlt = $(this).attr("title"); $(".largeImage").attr({ src: largePath, alt: largeAlt }); $("h1 em").html(" (" + largeAlt + ")"); return false; }); }); </script> 【html↓】 <div> <h1>ギャラリータイトル</h1> <p class="thumbs"> <a href="images/img2-lg.jpg" title="タイトル 2"> <img src="images/img2-thumb.jpg" /> </a> <a href="images/img3-lg.jpg" title="タイトル 3"> <img src="images/img3-thumb.jpg" /> </a> <a href="images/img4-lg.jpg" title="タイトル 4"> <img src="images/img4-thumb.jpg" /> </a> <a href="images/img5-lg.jpg" title="タイトル 5"> <img src="images/img5-thumb.jpg" /> </a> <a href="images/img6-lg.jpg" title="タイトル 6"> <img src="images/img6-thumb.jpg" /> </a> </p> <p><img class="largeImage" src="images/img1-lg.jpg" alt="タイトル 1" /></p> </div> 上記と同じ構造のdivが他にもいくつかあるのですが、個々のdiv全てに同じようにjqueryを 適用したいと思っています。 .each()を使ってみたのですが、.thumbsのaをクリックすると全てのdivの.largeImageが 反応してしまいます。 .click()の前に.each()を記述した場合も、後に記述した場合もうまくいきません。 個々のdivに適用するにはどうすればいいのでしょうか。 .each()を使う事自体が間違っているのでしょうか。 初心者なので分かりやすく教えていただければ幸いです。

    • ベストアンサー
    • AJAX
  • jQueryで、フェイドイン・フェイドアウトを追加

    fullscreenのはできたのですが、そこからのフェイドインをしてフェイドアウトをしていく仕組みを作ろうと思っていたのですが、そこだけがどうしても組み込めずにいるので助けていただけませんんでしょうか。 色々スクリプトを合体させてみたらりしてみました。 止む終えなく挫折してしまいました。 // 画像の配列を作成 var images = [ "img_001.jpg", "img_002.jpg", "img_003.jpg" ]; // 指定画像をプリロードする $(images).each(function(){ $('<img/>')[0].src = this; }); var index = 0; // 背景をコール。下記の場合、500ミリ秒で呼び出します。 $.fullscreen(images[index], {speed: 500}); setInterval(function() { index = (index >= images.length - 1) ? 0 : index + 1; $.fullscreen(images[index]); }, 5000);

  • jQuery class要素を盛り込むには

    画像をマウスオーバーで変化させるコードを、こちらで教えていただいたアドバイスに従って以下の内容で行っています。 $(function(){ $('span img').hover(function(){ $(this).attr('src', $(this).attr('src').replace('.jpg', 'x.jpg')); }, function(){ if (!$(this).hasClass('currentPage')) { $(this).attr('src', $(this).attr('src').replace('x.jpg', '.jpg')); } }); }); BODY部分は、 <SPAN><IMG src="画像.jpg"></SPAN> となっています。 けれど、よくよく考えると、マウスオーバーしたくない画像でも<SPAN>の中に記述していたらコードの影響をうけて、存在しない(マウスオーバー後の)画像を読み込もうとしてしまいます。 基本的な質問で申し訳ないのですが、 区別するため、例えば、マウスオーバーさせたい<SPAN>にはclass要素を入れて、 <SPAN class="change"><IMG src="画像.jpg"></SPAN> としたとして、上記のコードの、 $('span img').hover(function(){ の辺りをどうにか変えればいいように思うのですがよくわかりません。 基本的すぎて申し訳ありませんが、よろしくお願いします。

  • Javascript スライドショー

    Webページを作成しているのですが、JavaScriptで指定フォルダ内の画像をスライドショー形式で表示したいと思って、以下のコードを書いたのですが、どうも、上手く動作しないです。 おそらく最後の $('#rotatingimage').fadeOut(1000,function(){ $(this).attr('src',images[currentImage].src); $(this).fadeIn(); } が上手く動いていないと思うのですが、よく分かりません。 どなたか、分かる方いらっしゃいましたら、教えて頂けると助かります。 よろしくお願い致します。 <script type='text/javascript'> var images=new Array(); images[0]='images/1.jpg'; images[1]='images/2.jpg'; images[2]='images/3.jpg'; images[3]='images/4.jpg'; var currentImage = 0; var preloaded=false; var preloading = false; function preload(){ preloading=true; for(var i=0; i<images.length; i++){ var img = new Image(); img.src=images[i]; images[i] = img; } preloaded=true; } function animateImages(){ // if already preloading, we just want to return nothing if(!preloaded && preloading) return; // if not preloaded, we want to preload if(!preloaded) preload(); // considering we have already loaded stuffs currentImage++; currentImage = currentImage % 4; $('#rotatingimage').fadeOut(1000,function(){ $(this).attr('src',images[currentImage].src); $(this).fadeIn(); } ); } </script>

  • 別フレームからの背景切り替え

    同一ページでの背景切り替えは (1)<SCRIPT LANGUAGE="JavaScript"> <!-- Begin if (navigator.appName == "Microsoft Internet Explorer") { image_directory = "http://members.tripod.co.jp/oka1/"; clear = new Image(); clear.src = image_directory + "clear.jpg"; pic1 = new Image(); pic1.src = image_directory + "bg_wahuu.gif"; pic2 = new Image(); pic2.src = image_directory + "bg4.gif"; pic3 = new Image(); pic3.src = image_directory + "bg6.gif"; pic4 = new Image(); pic4.src = image_directory + "pgwck.gif"; pic5 = new Image(); pic5.src = image_directory + "ngllgch.gif"; pic6 = new Image(); pic5.src = image_directory + "wpckp.gif"; } function imagechange(imgName) { if (navigator.appName == "Microsoft Internet Explorer") { document.body.background = eval(imgName + ".src"); } } // End --> </script> /////////////////////////////////////////////////////////// (2)<a href="#" onMouseOver="imagechange('pic1');" onMouseOut="imagechange('clear');"><img src="http://www001.upp.so-net.ne.jp/oka/bg_wahuu.gif" border="0" width="144" height="158"></a> /////////////////////////////////////////////////////////// 以上の操作でできたのですが、 背景素材のサムネイルを別フレームに配置したい場合の、 別フレームからの背景切り替えの方法をご存知の方は教えていただけないでしょうか?

    • ベストアンサー
    • HTML
  • 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; }); }); });

  • ロールオーバーの外部ファイル化

    オンマウスにすると画像変化し、マウスを離すと元に戻る設定にしたいです。 複数の画像をロールオーバーさせたい場合、今までは外部ファイルに ↓↓ if (document.images) { // section on // test1 var test1on = new Image(); test1on.src = "img/test-02-02.jpg"; var test1off = new Image(); test1off.src = "img/test-01.jpg"; // test3 var test3on = new Image(); test3on.src = "img/test-03-03.jpg"; var test3off = new Image(); test3off.src = "img/testl-03.jpg"; // section off } // point section function On(id) { if (document.images) { document.images[id].src = eval(id + 'on.src'); } } // out section function Off(id) { if (document.images) { document.images[id].src = eval(id + 'off.src'); } } の様な記述をし、 <a href="1.html" onmouseover="On('test1')" onmouseout="Off('test1')"><img src="img/test-01.jpg" alt="img" id="test1" /></a> <a href="3.html" onmouseover="On('test3')" onmouseout="Off('test3')"><img src="img/test-03.jpg" alt="img" id="test3" /></a> として表示させていたのですが、今回<a href~ を使わないで<img~のみで構築したいのです。加えて、<img~の記述を上記の様にhtml内に長く書くのでなく、出来るだけシンプルにしたいのですが、どの様な改善を加えればよろしいのでしょうか。 分かりにくい説明ですが、ご理解ご指導の程よろしくおねがいします。

専門家に質問してみよう