2010-12-18 5 views
3

Ich habe einen Banner-Rotator und ich wollte Objekte anstelle von Funktionen verwenden, damit ich den Code effizienter machen konnte. Wie auch immer, ich kann nicht scheinen, SetInterval zu arbeiten. Ich denke, es hat etwas mit der Objektreferenz zu tun. Kann jemand das erklären? Hier ist, was ich bisher habe:Aufruf setterinterval mit Objektreferenz

window.addEvent('domready', function() { 
function set_banner(divid, array) 
{ 
    var banner = $(divid); 
    banner.set('html', '<a href=""><img src="" alt=""/></a>'); 
    var banner_link = $(divid).getElement('a'); 
    var banner_image = $(divid).getElement('img'); 

    var delay = 0; 

    for (var keys in banner1array) { 
     var callback = (function(key) { return function() { 
      banner.setStyle('opacity', 0); 
      var object = array[key]; 
      for (var property in object) { 
       if (property == 'href') { 
        var href = object[property]; 
       } 
       if (property == 'src') { 
        var src = object[property]; 
       } 
      } 
      if (!banner.getStyle('opacity')) { 
       banner.set('tween', {duration:1000});     
       banner_link.setProperty('href', href); 
       banner_image.setProperty('src', src); 
       banner.tween('opacity', 1); 
      } 
     }; })(keys); 
     setTimeout(callback, delay); 
     delay += 21000; 
    } 
} 

var banner1 = set_banner('banner1', banner1array); 
setInterval(function() {set_banner('banner1', banner1array);}, 84000); 

var banner2 = set_banner('banner2', banner2array); 
setInterval(function() {set_banner('banner2', banner2array);}, 84000); 

});

Antwort

2

Ein paar einfache Fehler:

var banner1 = new set_banner('banner1'); 
      ^---------- creates a new object and uses set_banner as the constructor 
          your code already gets called here 
          and you get a new object back, which in this case has NO use 

.... 
setInterval(banner1(), 42000); 
        ^----------------- The parenthesis EXECUTE the function 
             the RETURN VALUE is then passed to setInterval 
             BUT... banner1() is NOT a function, so this fails 

Was möchten Sie in Fall tun, die Sie set_banner nach 42 Sekunden anrufen möchten, und einen Parameter übergeben ist eine anonyme Funktion zu verwenden, die dann set_banner aufruft.

setInterval(function() { // pass an anonymous function, this gets executed after 42 seconds... 
    set_banner('banner1'); // ...and then calls set_banner from within itself 
}, 42000); 
+0

Danke für die Klärung für mich. –

1

Noch etwas zu beachten: http://zetafleet.com/blog/why-i-consider-setinterval-harmful. (tl: dr Anstelle setInterval, verwenden Sie setTimeout.) Während ich bin mir nicht sicher, dass seine Argumente hier gelten, scheint es eine gute Sache zu sein, die Gewohnheit zu vermeiden.

function defer_banner(div, bannerArray, delay) { 
    setTimeout(function() { 
    setBanner(div, bannerArray); 
    defer_banner(div, bannerArray, delay); 
    }, delay); 
}); 
Verwandte Themen