jqueryの変数を関数の外に出す方法

このQ&Aのポイント
  • setMove()の中のspeedを関数の外に出す方法を教えてください
  • speedを引数としてsetMove関数に渡すことで、関数の外でspeedを操作できます
  • target.animateで要素をアニメーションさせた後に、speedの値を変更することでアニメーション速度を調整できます
回答を見る
  • ベストアンサー

jqueryの変数を関数の外に出す方法

すみません非常に困っております。 setMove()の中のspeedを関数の外に出したいのですが、 どのようにすればよろしいでしょうか。 引数などを使用すればいいのだとおもいますが、 やり方がわからず。申し訳ございませんがご教示のほど よろしくお願いいたします。 var target = $('ul#mainNavi li').find('.light'); var speed = 1000; var t = setInterval(setMove() , speed); function setMove(){ target.animate({left:600} , 1000 , 'swing' , function(){ $(this).css('left' , -118) ; speed = 3000; }); }

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

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.3

いささか無駄が多いですが、こんなのはどうでしょうか function setMove() { var target = $('ul#mainNavi li').find('.light'); target.animate({left: '600'}, 1000, 'swing'); target.animate({left:'-118'}, 1); target.animate({left: '+=0'}, {duration:3000, complete:setMove}); } setTimeout(setMove, 1000);

その他の回答 (2)

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

A No1です。 >一度目はspeedが1000で、2度目以降に3000にするために、 >変数の上書きが必要だと思うのですが、 変数を上書きすれば変数の値は変わりますが、setInterval()でのインターバルはその文が実行された時の値で設定されます。 関数を実行する度に変数値が参照されるわけではありませんので、上書きしてもご主旨にそった結果にはならないと思います。 一方で、setIntervalの間隔は最初に関数が実行されるまでのタイムラグにもなりますので、即座に実行してから一定時間ごとに繰り返したいときなどに同様の処理が必要になると思います。 実現する方法はいろいろあると思いますが、 ◇1回目をsetTimeoutで呼び出して、2回目以降をsetIntervalで実行する。 (delayを無くすと、上記の「一度実行してから繰返し」になります) var target = $('#test'); var t; animate(1000, 3000, setMove); function animate(delay, interval, func){  setTimeout(function(){   func();   t = setInterval(func, interval);  }, delay); } ◇jQueryを利用なさっているようですが、コールバックの概念をsetMoveにも付加える (jQueryのコールバックと別に定義しているので、わかりにくくなりますが) var target = $('#test'); var t, speed = 1000; setTimeout(function(){  speed = 3000;  setMove(function(){ t = setInterval(setMove, speed); }); }, speed); function setMove(func){ target.animate({left:600} , 1000 , 'swing' , function(){  $(this).css('left' , -118);  if(typeof func === "function") func(); }); } などなど… 上の例は、自分ながら、あまり整理されたものになっていないですね。 もっと良い書き方がありそうな気がしますが、取りあえずで申し訳ありません。

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

ご質問の主旨がよくわかりかねますが… ご提示のコードが全体を示していると仮定してよいのなら、変数speedのスコープはすでに関数の外になっています。(当然、関数内でも使用できますが) >setMove()の中のspeedを関数の外に出したいのですが、 の意味が、 speed=3000; という文を関数の外に出したいという意味であるなら、ほぼ同じ処理としてmain側で  var target = $('ul#mainNavi li').find('.light');  var speed = 1000;  var t = setInterval(setMove() , speed);  speed = 3000; として、関数内の1行を削除しても、同様の処理となるでしょう。 コードが違うので、ちゃんと比較すれば異なりますが、ご提示のコードが全てだとすれば、実行の順序は保たれていますので(タイミングや再定義の回数等は違いますが処理の流れに影響がないので)同等ということができると思います。 ご質問の意味を取り違えていましたら、無視してください。

yukiponta
質問者

補足

一度目はspeedが1000で、2度目以降に3000にするために、変数の上書きが必要だと思うのですが、どのようにやればいいかわからない状態です。

関連するQ&A

  • 画像スライダーをやってますが

    <script type="text/javascript"> <!-- $(function(){ var sty=$("#s1"); sty.each(function(){ var mo1=$(this); var mo2=mo1.find("ul"); var mo3=mo1.find("li"); var mo4=mo1.find("li:first"); mo3.css({display:"block",opacity:"0",zIndex:"1"}); mo4.css({zIndex:"2"}).stop().animate({opacity:"1"},3500); setInterval(function(){ mo2.find('li:first-child').animate({opacity:'0'},1500).next('li').css({zIndex:'100'}).animate({opacity:'1'},1500).end().appendTo(mo2).css({zIndex:'99'}); },5000); }); }); --> </script> </head> <body> <div id="s1"> <ul> <li><img src="rtp/7.jpg" width="300px" height="300px"></li> <li><img src="rtp/9.jpg" width="300px" height="300px"></li> <li><img src="rtp/10.jpg" width="300px" height="300px"></li> </ul> </div> </body> </html> 見よう見まねで成功はしましたが、見真似なのでどういう構造なのか勉強しているところです。 今日は前半をなんとかやったんですが mo3.css({display:"block",opacity:"0",zIndex:"1"}); の部分のdisplay:"block"はなぜやっているのかが解りませんでした。 最初の設定は画像を消すところだと思うのですが、だとするとなぜblockなのかが解りません。

  • jQueryを使ったアコーディオンメニュー

    現在、色々なサイトを見ながら、jQueryを使用した アコーディオンメニューを作成しています。(かなりの初心者です。) リンク先をクリックして、ページが移動した際に、 メニューの開いた状態が保持されるようにしたいのですが、 どうすれば良いのかわからず困っています。 //////////////////////////////////////////////// <script type="text/javascript"> <!-- var $j = jQuery; $j(function(){ $j(".acc").each(function(){ $j("a.open", this).each(function(index){ var $this = $j(this); if(index >= 0) $this.next().hide(); $this.click(function(){ var params = {height:"toggle"}; $j(this).next().animate(params).parent().siblings() .children("ul:visible").animate(params); return false; }); }); }); }); //--> </script> html部分 <ul> <li>ABC <ul> <li>A</li> <li>B</li> <li>C</li> </ul> </li>... </ul> //////////////////////////////////////////////// ↑このような感じで表記しています。 どなたかお詳しい方、ご教示よろしくお願いします。

  • jqueryで画像切り替え

    この場をお借りして教えて頂ければ幸いです。 jqueryについて、今現在添付画像のようなサムネイルをマウスオーバーしますと、 メイン画像が切り替わるようなものをjjqueryを使用して制作しました。 ここから、setIntervalを使用して画像が何もしなければ勝手に切り替わるように、 またマウスオーバーをしている際は切り替わらないように、そしてマウスアウトしたら そこの画像から順にsetIntervalが開始されるようにしたいと思っております。 そこの作業が出来ず困っておりまして、是非ともお教え頂ければと思います。 今現在のhtml , css , jsの方は記載しておきます。※reset.cssは除きます。 <body> <div id="wrap"> <div id="sec1"> <div id="photoBox"> <ul id="photo"> <li><img src="img/plan1.jpg" alt="食1" /></li> <li><img src="img/plan2.jpg" alt="食2" /></li> <li><img src="img/plan3.jpg" alt="食3" /></li> </ul> <ul id="thumb"> <li class="first"><img src="img/plan1_s.jpg" alt="" /></li> <li><img src="img/plan2_s.jpg" alt="" /></li> <li><img src="img/plan3_s.jpg" alt="" /></li> </ul> </div>     </div> </div> </body> -------------------------------------------------------------------- div#wrap{ width:394px; margin:0 auto; } div#photoBox{ width:394px; height:391px; padding:40px 0; border-bottom:1px solid #CCC; } div#photoBox ul#photo{ width:394px; height:295px; padding-bottom:5px; position:relative; } div#photoBox ul#photo li{ width:394px; height:295px; display:block; position:absolute; top:0; left:0; } div#photoBox ul#thumb{ width:394px; height:91x; position:relative; } div#photoBox ul#thumb li{ float:left; padding-left:5px; } div#photoBox ul#thumb li.first{ padding-left:0; } --------------------------------------------------------- (function(){ var photo = $('#photo').find('li'); var thumb = $('#thumb').find('li'); photo.hide().eq(0).show(); thumb.hover(function(){ $(this).stop().fadeTo('fast', 0.6); photo.stop().fadeTo('fast', 0) .eq($(this).index()) .stop().fadeTo('fast', 1); }, function(){ $(this).stop().fadeTo('fast', 1); }); })

  • jQueryで作ったドロワーメニューに画像が被る

    トップページにjQueryを使ってドロワーメニューとカルーセルとアコーディオンメニューを作成しました。 それぞれは作動するのですが、ドロワーを一番上に表示させたいのにカルーセルとアコーディオンメニューが上に被ってしまいます。 jQueryは初心者です。よろしくお願いします。 【html】 <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.3.min.js"><\/script>')</script> <script src="js/slick.min.js"></script> </head> <body> <div id="wrapper"> <header id="header"> <div class="navDrawrBtn"><span></span></div> <nav class="navDrawr" role="tablist"> <ul> <li> <a>A</a> <ul class="sub" role="tabpanel"> <li><a>a</a></li> <li><a>b</a></li> <li><a>c</a></li> </ul> </li> <li> <a>B</a> <ul class="sub" role="tabpanel"> <li><a>a</a></li> <li><a>b</a></li> <li><a>c</a></li> </ul> </li> </ul> </nav></header> <div class="contents"> <section class="carousel"> <div class="gimmicCarousel"> <ul class="slider"> <li><a href="#"><img src="images/carousel_1.jpg"></a></li> <li><a href="#"><img src="images/carousel_2.jpg"></a></li> <li><a href="#"><img src="images/carousel_3.jpg"></a></li> </ul></div></section> <div class="accordion"> <ul> <li> <a class="toggle">C</a> <ul> <li><a href="#">ca</a></li> <li><a href="#">cb</a></li> <li><a href="#">cc</a></li> </ul> </li> <li> <a class="toggle">D</a> <ul> <li><a href="#">da</a></li> <li><a href="#">db</a></li> <li><a href="#">dc</a></li> </ul> </li> <script>// ACCORDION $(function() { function accordion() { $(this).toggleClass("active").next().slideToggle(300); } $(".accordion .toggle").click(accordion); });</script> <script src="js/script.js"></script> </body> </html> 【jcript.js】 $(function () { var $nav = $('.navDrawr'); var $navBtn = $('.navDrawrBtn'); var $speed = 300; var $navW = 270; //サブメニューを非表示に $nav.find('.sub').hide(); //hover時の挙動 $nav.find('li').hover(function(){ // PC表示時(ハンバーガーボタン非表示時)のみにプルダウンを限定 if ($('.navDrawrBtn span').css('display') !== 'block'){ //li要素にhoverした時に.subがあれば実行する if( $(this).find('.sub').length && !$nav.hasClass('open') ){ $(this).find('.sub').slideDown(); } }jj },function(){ // PC表示時(ハンバーガーボタン非表示時)のみにプルダウンを限定 if ($('.navDrawrBtn span').css('display') !== 'block'){ if(!$nav.hasClass('open')) { $(this).find('.sub').stop(true).slideUp(); } } }); //ドロワーに関連した記述(PCでもドロワーが動作するようにtouchend→clickに変更) $('body').on('click','.navDrawrBtn span',function(){ drawerFunc(); }); $('body').on('click','.overlay',function(){ drawerFunc(); }); function drawerFunc(){ if( $('body').hasClass('menuOpen') ){ $('body').removeClass('menuOpen'); $nav.animate({right:-1*$navW},$speed,'swing'); $('.overlay').fadeOut($speed); }else{ $('body').addClass('menuOpen'); if(!$('.overlay').length){ $('#wrapper').prepend('<div class="overlay"></div>'); } $nav.animate({right:0},$speed,'swing'); $('.overlay').fadeIn($speed); } } }); //カルーセルの設定 $(function () { $('.gimmicCarousel .slider').slick({ accessibility: true, dots: true, autoplay: true, autoplaySpeed:3000, infinite: true, speed: 500, slidesToShow: 3, slidesToScroll: 1, responsive: [ { breakpoint: 768, settings: { slidesToShow: 2, slidesToScroll: 1, } }, { breakpoint: 480, settings: { slidesToShow: 1, slidesToScroll: 1, } } ] }); });

  • jQuery プルダウンメニュー

    プルダウンメニューの一部で行き詰っています。 メニュー1のサブメニューが開いている状態で、メニュー2をクリックした時 メニュー1のサブメニューが閉じるようにする(その逆パターンも含む)。 サブメニューにカーソルがある時、メニューはhoverさせないようにする。 ▼html----------------------------------------- <ul id="gNav"> <li>メニュー1 <ul> <li><a href="">サブメニュー1-1</a></li> </ul> </li> <li>メニュー2 <ul> <li><a href="">サブメニュー2-1</a></li> <li>サブメニュー2-2 <ul> <li><a href="">サブメニュー2-2-1</a></li> <li><a href="">サブメニュー2-2-2</a></li> <li><a href="">サブメニュー2-2-3</a></li> </ul> </li> </ul> </li> <li><a href="">メニュー3</a></li> </ul> ▼jQuery----------------------------------------- $(function(){ $("#gNav > li").click(function(){ $(this).children("ul").toggle(); }); $("#gNav > li > ul > li").mouseenter(function(){ $(this).children("ul").show(); }).mouseleave(function(){ $(this).children("ul").hide(); }); $("#gNav > li").hover(function(){ $(this).css("background-color","#ff9900"); },function(){ $(this).css("background-color","#ffcc00"); }); $("#gNav > li > ul > li").hover(function(){ $(this).css("background-color","#99cc66"); },function(){ $(this).css("background-color","#669933"); }); $("#gNav > li > ul >li > ul >li").hover(function(){ $(this).css("background-color","#dddddd"); },function(){ $(this).css("background-color","#eeeeee"); }); }); 宜しくお願いします。

  • jQueryを使用してのメガメニューの記述

    色々試してみたのですが、どうしてもわからず、 どうかお知恵をおかしください。 宜しくお願いいたします。 こちらの紹介サイトを参考に、メガメニューを作成しております。↓ http://codesign.verse.jp/jquery/2009/08/megamenu.html メガメニューボタンにマウスオーバーしたときに、 DIVに指定しているmm-div内のものが表示されるよう指定されているのですが、 そのメニューの中でいくつかmm-divのサイズを変更したく、 それに伴いjQueryで表示させる位置の指定を複数記述したいのですが、 jQueryを勉強不足のため、どうしてもうまくいきません。 mm-divはCSSでサイズを記述しているので、 別途指定するものとして新しいDIVに指定するタグとして mm-div2を準備しましたが、1つに連動してしまいます。 説明べたで申し訳ありませんが、 mm-divとmm-div2それぞれに別の位置が指定できる記述に仕方を教えてください。 $(function(){ var target=$("div#megamenu"); var tli=$("ul#mm-ul > li.mm-li"); var tdi=$("div.mm-div",tli); /* if($.browser.msie && ($.browser.version<8)){ var th=; }else{ var th=0; } */ tli.hover( function(){ $("*:animated",tdi).hide(); $(this).animated(); }, function(){ tdi.hide(); } ); $.fn.animated=function(){ var posx=$(this).offset().left+tdi.width(); var posbase=tli.offset().left+target.width(); /*地味に計算するための場所orz $("p#showpos").text(posx); $("p#winwidth").text(posbase); */ tdi.hide(); if(posx>posbase){ $(this).children() .css("left",-posx+target.width()) .css("top","25px") .fadeIn("fast"); }else{ $(this).children() .css("left","5px") .css("top","25px") .fadeIn("fast"); } return $(this); } });

  • jqueryプルダウンメニュー個別着色

    すみません。デザイナーでjqueryの配布しているものをお借りしているのですが、 プルダウンメニューで、メニューの色を個別に変えたいのですが、 CSSクラス名ごとに、下記のスクリプトを書かないといけないのでしょうか? それとも、$('.btn')のところを、$('.btn','.btn2','.btn3')とかって省略はできますか? 基本を解ってなくてすみません; どうぞ宜しくお願い致しますm(==)m <script type="text/javascript"> $(function(){ $('.btn').hover(function(){ var btn = $(this).find('li').length; $(this).animate({'height':24 * btn + 'px'},'fast'); },function(){ $(this).animate({'height':'24px'},'fast'); }); }); </script>

  • html内にあるJavaScriptを外部に出したいのですが、書き方が

    html内にあるJavaScriptを外部に出したいのですが、書き方が分かりません。 ご指導をお願いします。 【現在html】 <script type="text/javascript"> $(function(){ //初期設定 $("#carouselInner").css("width",620*$("#carouselInner ul.column").size()+"px"); $("#carouselInner ul.column:last").prependTo("#carouselInner"); $("#carouselInner").css("margin-left","-620px") //戻るボタン $("#carouselPrev").click(function(){ $("#carouselNext,#carouselPrev").hide(); $("#carouselInner").animate({ marginLeft : parseInt($("#carouselInner").css("margin-left"))+620+"px" },"slow","swing" , function(){ $("#carouselInner").css("margin-left","-620px") $("#carouselInner ul.column:last").prependTo("#carouselInner"); $("#carouselNext,#carouselPrev").show(); }) }) //進むボタン $("#carouselNext").click(function(){ $("#carouselNext,#carouselPrev").hide(); $("#carouselInner").animate({ marginLeft : parseInt($("#carouselInner").css("margin-left"))-620+"px" },"slow","swing" , function(){ $("#carouselInner").css("margin-left","-620px") $("#carouselInner ul.column:first").appendTo("#carouselInner"); $("#carouselNext,#carouselPrev").show(); }) }) // 8秒間隔でスクロール var timerID = setInterval(function(){ $("#carouselNext").click() },8000) // ユーザーが操作すると、タイマーを停止 $("#carouselPrev img,#carouselNext img").click(function(){ clearInterval(timerID); }) }) </script>

  • jqueryについて困っております。

    下記のスライドショーを同一ページ内に複数つけたいのですが、 バグがでてしまいます。 おそらく変数がバッティングしてしまっていて、photogallery1とphotogallery2が 干渉しあわないようにしたいのですが、どのようにしたらいいかわかりません。 ご教示いただければ幸いです。 すみません大変急いでおりまして、出来ればすぐに皆様のお力を貸していただければ と思っております。よろしくお願いいたします。 $(function(){ pg('#photogallery1'); pg('#photogallery2'); function pg(selector){ $(selector).each(function(){ var photo = $(".photoBox").find('li'); var thumb = $(".thumbBox").find('li'); var fadeSpeed = 400; var changeSpeed = 4000; var photoLength = photo.length; var nowBox = 0 photo.filter(":not(':eq(0)')").hide(); var timer = setInterval(slideshow , changeSpeed); function slideshow(){ if(nowBox == photoLength - 1){ photo.fadeTo(fadeSpeed , 0); nowBox = 0; photo.eq(nowBox).fadeTo(fadeSpeed , 1); }else{ photo.fadeTo(fadeSpeed , 0); nowBox ++; photo.eq(nowBox).fadeTo(fadeSpeed , 1); } }; thumb.hover(function(){ clearInterval(timer); $(this).stop().fadeTo(fadeSpeed , 0.6); nowBox = $(this).index(); photo.stop().fadeTo(fadeSpeed , 0) .eq(nowBox).stop().fadeTo(fadeSpeed , 1); },function(){ timer = setInterval(slideshow , changeSpeed); $(this).stop().fadeTo(fadeSpeed , 1); }); }); }; });

  • 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; }); });

専門家に質問してみよう