2011-01-05 10 views
1

これはFirefoxとChromeでは動作しますが、IEでは動作しません。jQuery + setTimeout()+ clearTimeout()がIE7&8で動作しない

Internet Explorerでは、タイマーがクリアされず、update_slideshow()が呼び出されるたびに新しいタイマーが作成されます。

// slideshow params 
var currentSlide = 1; 
var numSlides = 4; 
var pause = false; 

function pause_show(bool){ 
    pause = bool; 
} 

// transitions the slides 
function update_slideshow(slide){ 
    if(slide > numSlides) slide = 1; 

    //is user tyring to pause/play this slide 
    if(currentSlide == slide){ 
     switch(pause){ 
      case false: 
       $("#ssbut" + slide.toString()).removeClass('pause').addClass('play'); 
       pause = true; 
      break; 

      case true: 
       $("#ssbut" + slide.toString()).removeClass('play').addClass('pause'); 
       pause = false; 
      break; 
     } 
    }else{ //user clicked on a button other than the current slide's 
     clearTimeout(slideTimer); 
     function complete() { 
      $("#slide" + slide.toString()).fadeIn(500, "linear"); 
      if(!pause) 
       $("#ssbut" + slide.toString()).removeClass('inactive').addClass('pause'); 
      else 
       $("#ssbut" + slide.toString()).removeClass('inactive').addClass('play'); 
     } 
     $("#ssbut" + currentSlide.toString()).removeClass('play').addClass('inactive'); 
     $("#slide" + currentSlide.toString()).fadeOut(300, "linear", complete); 

     currentSlide = slide; 
     if (typeof(slideTimer) != 'undefined') clearTimeout(slideTimer); 
     slideTimer = setTimeout("slideshow()",4000); 
    } 
} 

function slideshow(){ 
    if (typeof(slideTimer) != 'undefined') clearTimeout(slideTimer); 
    if(!pause){ 
     update_slideshow(currentSlide + 1); 
    } 
    slideTimer = setTimeout("slideshow()",4000); 
} 
var slideTimer = setTimeout("slideshow()",4000); 
+0

あなたのソースコードをすべて強調表示し、ツールバーのコードボタンを押してください({}) –

+0

このコード内で少なくとも半ダースの問題を見つけることができます... uff。 1. 'pause_show'関数が不要です2.' == 'を使う3.ブール値をトグルするためにswitch文を使う4.' {} 'を一貫して使わない5.' setTimeout'に 'eval 'は数字6になります –

答えて

3

文字列の代わりに関数参照でsetTimeoutを試してみることがあります。これに

setTimeout("slideshow()",4000); 

:この変更注意点として

setTimeout(slideshow, 4000); 

を、あなたはいくつかのコードを簡素化することを検討してください。あなただけpauseのための2つの状態を持っているので、この:

$('#ssbut' + slide.toString()).toggleClass('pause play', pause); 
pause = !pause; 


更新:

switch(pause){ 
    case false: 
    $("#ssbut" + slide.toString()).removeClass('pause').addClass('play'); 
    pause = true; 
    break; 
    case true: 
    $("#ssbut" + slide.toString()).removeClass('play').addClass('pause'); 
    pause = false; 
    break; 
} 

...このような何かを書き換えることができOPが誤ってslideShow機能に再帰ていることに気づきました:

function slideshow(){ 
    // stuff 
    slideTimer = setTimeout("slideshow()",4000); // -> now there's your problem 
} 

この行を削除すると問題が解決します。

+0

私はスライドショーだけにスライドショー()を変更しようとしましたが、「あまりにも多くの再帰」エラーが発生しました – anon

+1

ああ、待ってください。あなたの関数はタイマーで再帰的に呼び出されていますか?私はあなたが望むものではないと確信しています。その 'setTimeout'行を' slideShow'関数から取り出してみてください。 –

+0

あなたの私のヒーロー、ケン・レドラー。それはすべてを殺していたslideshow()関数の中のsetTimeoutでした。ありがとう! – anon

関連する問題