2011-12-23 4 views
0

Может ли кто-нибудь сказать мне, почему это не работает?jQuery каждый с SetTimeout

jeMarkers - это массив маркеров Google Maps.

function toggleBounce() { 
    var bcounter = 0; 
    $(jeMarkers).each(function() { 
     setTimeout(function() { 
      if (this.getAnimation() != null) { 
       this.setAnimation(null); 
      } else { 
       this.setAnimation(google.maps.Animation.BOUNCE); 
      } 
     }, bcounter * 100); 
     bcounter++; 
    }); 
} 

Если я же без функции SetTimeout он работает, но, очевидно, делает все маркеры сразу:

function toggleBounce() { 
    $.each(jeMarkers, function() { 
     if (this.getAnimation() != null) { 
      this.setAnimation(null); 
     } else { 
      this.setAnimation(google.maps.Animation.BOUNCE); 
     } 
    }); 
+0

Попробуйте setTimeout в '$ .each' вместо' $ ("element"). each() '. – Purag

ответ

2

Вы должны кэшировать this объект внутри функции, так как контексте SetTimeout не устанавливается автоматически:

function toggleBounce() { 
    var bcounter = 0; 
    $(jeMarkers).each(function() { 
     var that = this; // <- Cache the item 
     setTimeout(function() { 
      if (that.getAnimation() != null) { 
       that.setAnimation(null); // <- Now we can call stuff on the item 
      } else { 
       that.setAnimation(google.maps.Animation.BOUNCE); 
      } 
     }, bcounter * 100); 
     bcounter++; 
    }); 
} 
+2

Это называется замыканием (как в: * «JavaScript создает замыкание вокруг« var that' »*), и это одна из наиболее полезных функций JavaScript. Подробнее о закрытии: https://developer.mozilla.org/en/JavaScript/Guide/Closures – PPvG

+0

PPvG прав, я должен был сказать это явно :) – mfeineis

+0

Вот и все! Я так уверен, что сделал что-то подобное во всех своих попытках, но я, очевидно, не понял. Большое спасибо!! – Brigante