2016-03-31 17 views
3

私はスロットマシンをやっていますが、誰かがクリックして追加するか、または 行を差し引いて表示したいと思います。私は次のコードを使用しています。問題は、誰かがすばやく(遅延時間よりも速く)クリックすると、予想よりも大きな遅延が発生することです。ここで)(dequeueをdemostration(およびJSFiddlejQueryの遅延をリセットするには?

Bug

function arrowNumbers(id,min,max,difference){ 
 
\t if ((min === undefined) || (min < 0)){ 
 
\t \t min = 1; 
 
\t } 
 
\t if((difference === undefined)) { 
 
\t \t difference = 1; 
 
\t } 
 
\t var previousArrow = $('.'+id+' .previous'); 
 
\t var nextArrow = $('.'+id+' .next'); 
 

 
\t var screenNumbers = $('.'+id+' span'); 
 
\t var actualNumber = $('.'+id+' span').text(); 
 

 
\t var n = actualNumber; 
 

 
\t previousArrow.click(function(){ 
 
\t \t if (n>min){ 
 
\t \t \t if (parseInt(difference)>=parseInt(n)) 
 
\t \t \t \t n = min; 
 
\t \t \t else 
 
\t \t \t \t n = parseInt(n)-parseInt(difference); 
 
\t \t \t showNumber(n); 
 
\t \t \t if (id=='line') 
 
\t \t \t \t showLines(n); 
 
\t \t } 
 
\t }); 
 

 
\t nextArrow.click(function(){ 
 
\t \t if (n<max){ 
 
\t \t \t if (parseInt(difference)+parseInt(n)>max) 
 
\t \t \t \t n = max; 
 
\t \t \t else 
 
\t \t \t \t n = parseInt(n)+parseInt(difference); 
 
\t \t \t showNumber(n); 
 
\t \t \t if (id=='line') 
 
\t \t \t \t showLines(n); 
 
\t \t } 
 
\t }); 
 

 
\t function showNumber(n){ 
 
\t \t screenNumbers.text(n); 
 
\t } 
 
} 
 

 
function showLines(lines){ 
 
\t var container = 'lines'; 
 
\t var t = 1000; 
 
\t switch (lines) { 
 
\t \t case 20: $('.'+container+' .l.l-20').show(0).delay(t).hide(0); 
 
\t \t case 19: $('.'+container+' .l.l-19').show(0).delay(t).hide(0); 
 
\t \t case 18: $('.'+container+' .l.l-18').show(0).delay(t).hide(0); 
 
\t \t case 17: $('.'+container+' .l.l-17').show(0).delay(t).hide(0); 
 
\t \t case 16: $('.'+container+' .l.l-16').show(0).delay(t).hide(0); 
 
\t \t case 15: $('.'+container+' .l.l-15').show(0).delay(t).hide(0); 
 
\t \t case 14: $('.'+container+' .l.l-14').show(0).delay(t).hide(0); 
 
\t \t case 13: $('.'+container+' .l.l-13').show(0).delay(t).hide(0); 
 
\t \t case 12: $('.'+container+' .l.l-12').show(0).delay(t).hide(0); 
 
\t \t case 11: $('.'+container+' .l.l-11').show(0).delay(t).hide(0); 
 
\t \t case 10: $('.'+container+' .l.l-10').show(0).delay(t).hide(0); 
 
\t \t case 9: $('.'+container+' .l.l-9').show(0).delay(t).hide(0); 
 
\t \t case 8: $('.'+container+' .l.l-8').show(0).delay(t).hide(0); 
 
\t \t case 7: $('.'+container+' .l.l-7').show(0).delay(t).hide(0); 
 
\t \t case 6: $('.'+container+' .l.l-6').show(0).delay(t).hide(0); 
 
\t \t case 5: $('.'+container+' .l.l-5').show(0).delay(t).hide(0); 
 
\t \t case 4: $('.'+container+' .l.l-4').show(0).delay(t).hide(0); 
 
\t \t case 3: $('.'+container+' .l.l-3').show(0).delay(t).hide(0); 
 
\t \t case 2: $('.'+container+' .l.l-2').show(0).delay(t).hide(0); 
 
\t \t case 1: $('.'+container+' .l.l-1').show(0).delay(t).hide(0); 
 
\t } 
 
} 
 

 
arrowNumbers('line',1,20);
.lines { 
 
    width: 500px; 
 
    height: 200px; 
 
} 
 

 
.lines > .l { width:50px; height: 50px; color: #fff; float: left; background: #000; margin: 10px 0 0 0; display: none; } 
 
.lines > .l:nth-child(2n){ background: rgba(0,0,0,.5); } 
 

 
/* */ 
 

 
.line { 
 
    color: #fff; 
 
    font-size: 30px; 
 
    width: 300px; 
 
    height: 100px; 
 
} 
 

 
.line > .previous, .line > .next { 
 
    width: 100px; 
 
    height: 100%; 
 
    background: blue; 
 
    float: left; 
 
} 
 

 
.line > span { 
 
    width: 100px; 
 
    height: 100%; 
 
    background: green; 
 
    float: left; 
 
    display: block; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="lines"> 
 
\t <div class="l l-1">1</div> 
 
\t <div class="l l-2">2</div> 
 
\t <div class="l l-3">3</div> 
 
\t <div class="l l-4">4</div> 
 
\t <div class="l l-5">5</div> 
 
\t <div class="l l-6">6</div> 
 
\t <div class="l l-7">7</div> 
 
\t <div class="l l-8">8</div> 
 
\t <div class="l l-9">9</div> 
 
\t <div class="l l-10">10</div> 
 
\t <div class="l l-11">11</div> 
 
\t <div class="l l-12">12</div> 
 
\t <div class="l l-13">13</div> 
 
\t <div class="l l-14">14</div> 
 
\t <div class="l l-15">15</div> 
 
\t <div class="l l-16">16</div> 
 
\t <div class="l l-17">17</div> 
 
\t <div class="l l-18">18</div> 
 
\t <div class="l l-19">19</div> 
 
\t <div class="l l-20">20</div> 
 
</div> 
 

 
<div class="line"> 
 
    <div class="previous"> 
 
    <div class="arrow">pre</div> 
 
    </div> 
 
\t <span>1</span> 
 
\t <div class="next"> 
 
\t <div class="arrow">next</div> 
 
\t </div> \t 
 
</div>

+0

あなたはjsfiddleを追加することはできますか? – RRK

+1

これは、 '.delay()'イベントがキューにお互いに「スタック」し、新しい呼び出しでキャンセルされないためです。この問題を解決するには、[この質問](http://stackoverflow.com/questions/7929266/jquery-delay-how-to-stop-it)(※可能な複製*)をご覧ください。 –

+0

@RejithRKrishnan遅れて申し訳ありませんが、ここでは[fiddle](https://jsfiddle.net/arglab/0f0rdoh7/1/) – nanilab

答えて

2

delay()は、停止して開始できないように構築されていません。代わりに、のsetTimeoutとてclearTimeout

はこれであなたのshowLines機能を交換し使用します。

var line_timers = {}; 
function showLines(lines){ 
    var container = 'lines'; 
    var t = 1000; 
    for(var i=1;i<=20;i++) { 
     var selector = '.'+container+' .l.l-' + i; 
     clearTimeout(line_timers[selector]); 
     if(i<=lines){ 
     $(selector).show(0); 
     line_timers[selector]=setTimeout((function(x){ 
      return function(){ 
      $(x).hide(0); 
      } 
     })(selector),t); 
     } else { 
     $(selector).hide(0); 
     } 
    } 
} 

フィドルhttps://jsfiddle.net/trex005/sm14hn79/

+0

ここであなたのフィドルで置き換えられます:https://jsfiddle.net/trex005/0f0rdoh7/2/ – trex005

1

してみてくださいされています

​​3210

別のオプションが遅れ、ショーを交換して非表示にするだろうfade/animate、setTimeoutを使い、単にstop()とclearTimeout()を使います

+1

です。彼はスイッチでフォールスルーを使って1行表示していますが、これは'while(lines - )' – trex005

+0

@ trex005ああ、欠けていることに気付かなかった。:)ありがとう! – Alex

+0

ありがとうございます@アレックス、しかし、多分私はあなたが言ったようにフェード/アニメーションを使用して試す必要があります。これはdequeue()を使用して発生します:http://i.imgur.com/NBkFBVK.gif – nanilab