2010-12-18 3 views
3

저는 배너 회전자가있어서 코드를 더욱 효율적으로 만들 수 있도록 함수 대신 객체를 사용하고 싶습니다. 어쨌든 setInterval이 작동하지 않는 것 같습니다. 객체 참조와 관련이 있다고 생각합니다. 아무도 이것을 설명 할 수 있습니까? 여기에 내가 지금까지 가지고있는 것이있다 :객체 참조를 사용하여 setinterval 호출

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

});

답변

2

간단한 실수의 몇 :

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 

당신이 당신이 set_banner 42 초 후에 전화 및 매개 변수를 전달 할 경우에 대비하고 싶은 것은 다음 set_banner를 호출하는 익명 함수를 사용하는 것입니다.

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

나를 지워 줘서 고마워. –

1

기타 사항 : http://zetafleet.com/blog/why-i-consider-setinterval-harmful. (tl : dr 대신 setInterval을 사용하십시오. setTimeout을 사용하십시오.) 그의 주장이 여기에 적용되는지 잘 모르겠지만, 피하는 습관을 갖기에는 좋은 것 같습니다.

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