2011-01-05 12 views
1

Dies funktioniert in Firefox und Chrome, aber nicht in IE.jQuery + setTimeout() + clearTimeout() funktioniert nicht in IE7 & 8

Im Internet Explorer werden die Timer nicht gelöscht und es erscheint jedes Mal, wenn update_slideshow() aufgerufen wird, wird ein neuer Timer erstellt.

// 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

Bitte bearbeiten Sie Ihre Frage, markieren Sie Ihren gesamten Quellcode und drücken Sie die Code-Taste in der Symbolleiste (sieht aus wie ein paar geschweifte Klammern: {}) –

+0

Ich kann mindestens ein halbes Dutzend verschiedene Probleme innerhalb dieses Codes erkennen ... uff. 1. 'pause_show' Funktion ist überflüssig 2. Verwendung von' == '3. Switch-Anweisung zum Umschalten eines Boolean 4. Inkonsistente Verwendung von' {} '5. Verwendung von String in' setTimeout', was der Verwendung von 'eval entspricht 'das wäre Nummer 6 dann –

Antwort

3

Sie könnten versuchen, anstelle einer Zeichenfolge setTimeout mit einer Funktion Referenz. Ändern Sie dies:

setTimeout("slideshow()",4000); 

Um dies:

setTimeout(slideshow, 4000); 

Als Randbemerkung, sollten Sie überlegen, einen Code zu vereinfachen. Sie haben nur zwei Zustände für pause, so folgt aus:

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

... geschrieben so etwas wie das sein kann:

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


Update: Bemerkt, dass die OP versehentlich wurde Rekursion in der slideShow Funktion :

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

Das Entfernen dieser Zeile löst das Problem.

+0

Ich habe versucht," Slideshow() "nur Slideshow zu ändern, aber ich habe den Fehler" zu viel Rekursion " – anon

+1

Oh, warte. Ihre Funktion ruft sich rekursiv in einem Timer auf? Ich bin mir sicher, dass du das nicht willst. Versuchen Sie, diese 'setTimeout' Zeile aus Ihrer' slideShow' Funktion herauszunehmen. –

+0

Ken Redler dein mein Held. Es war das setTimeout in der Funktion slideshow(), das alles löschte. Vielen Dank! – anon

Verwandte Themen