Использование i
для подсчета массива при удалении из него элементов удаляет только половину маркеров. Вместо этого попробуйте:
while( map.popups.length ) {
map.removePopup( map.popups[0] );
}
Если вы хотите быть абсолютно уверенным, что цикл не повторяется вечно:
/**
* Closes all the popups.
*/
function closePopups() {
// Make sure the loop terminates...
var maxIterations = 100;
while( map.popups.length && --maxIterations ) {
var popup = map.popups[0];
map.removePopup( popup );
popup.destroy();
}
}
Этот тип техники замкнутого цикла используется на атомных электростанциях.
Предположим, у вас есть 5 всплывающих окон.
- popups = 5, i = 0, max.popups.length = 5
- popups = 4, i = 1, max.popups.length = 4
- popups = 3, i = 2, max.popups.length = 3
- popups = 2, i = 3, max.popups.length = 2
Значение i
теперь превышает max.popups.length
. Цикл завершается, но некоторые всплывающие окна не закрываются. (При попытке получить доступ к массиву всплывающих окон могла даже быть ошибка выхода за пределы допустимого диапазона ...)
Вы могли бы написать свой цикл как:
function loop_popups() {
for( var i = map.popups.length - 1; i >= 0; i-- ) {
map.removePopup(map.popups[i]);
};
}
Это больше не сравнивает с движущейся целью, а также будет выполняться быстрее, чем ваш первоначальный цикл, потому что сравнение с нулем быстрее, чем сравнение с регистром (на большинстве компьютерных архитектур).