Клуб API Карт

Про объект YMaps.YMapsML

Пост в архиве.
andreypalm
2 октября 2009, 15:11
Добрый день!

Нужно периодически обновлять положение меток на карте.
Для это создаю
объект
ml = new YMaps.YMapsML('http://ip/param.xml');
и добавляю его оверлеем на карту
map.addOverlay(ml);
Собвственно - все как в примерахю

При загрузке карты - метки отображаются, при вызове
function RefreshLabel () - в принципе тоже.
Но есть ощущение что каждый раз создавать новый YMaps.YMapsML не верно.
Прежде чем создать новый объект, надо удалить старый...
Как - не могу понять.
А может есть другое решение ?

Код страницы:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Знакомство с JavaScript API. Простой вызов карты.</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANXtwUoBAAAAL4SQBwIA-dPRo5Gi1P3tO9TMlo1_ouqRAnsAAAAAAAAAAAD80ov6u0TgJDuvAbHveRWC19Brxg=="
type="text/javascript"></script>
<script type="text/javascript">
var map;
var ml;


function LoadLabel () {
ml = new YMaps.YMapsML('http://xxx.xxx.xxx.xxx/param.xml');
map.addOverlay(ml);
YMaps.Events.observe(ml, ml.Events.Fault, function (ml, error) {
alert('Ошибка: ' + error);
})
};

function RefreshLabel () {
map.removeOverlay (ml);
LoadLabel ();

};

window.onload = function () {
map = new YMaps.Map(document.getElementById("YMapsID"));
map.setCenter(new YMaps.GeoPoint(30.381487,59.917801), 10);
map.addControl(new YMaps.Zoom());
LoadLabel ();
UpdateIntervalID = window.setInterval(function() { RefreshLabel ();} , 5000);

};


</script>


</head>
<body>
    <input type="button" value="Обновить" onclick="RefreshLabel ()" />

<div id="YMapsID" style="width:800px;height:600px"></div>
</body>
</html>



Заранее спасибо!

з.ы. сразу не пинайте, в JS полный профан, да и с API только знакомлюсь...

7 комментариев
А зачем Вы обновляете данные раз в 5 секунд? Они так часто меняются?

Быть может лучше использовать не YMapsML, а подгружать данные в формате json c помощью ajax? И если у каждого объекта уникальный ID, то Вы сможете контролировать какие объекты добавить, а какие удалить.
5 секунд от балды взял.  На самом деле обновление будет раз  в 30 сек,  а может и реже..

По поводу AJAX -   надо подумать... 
Спасибо за подсказку!
removeOverlay удаляет YMapsML, так что можете оставить как есть

обновление данных чаще чем 15 секунд безполезно, это время на которое ваш файл кешируется на нашей стороне
удаляет YMapsML ?
Странно, а память течет, и очень прилично - на кахдое обновление   по 1-2  метра.
Проверял и на Mozilla и на IE...
Обработчик события Fault нужно удалять вручную. Т. е.
var map, ml, listenerFault;

function LoadLabel () {
ml = new YMaps.YMapsML('http://84.52.73.125/param.xml');
map.addOverlay(ml);

// Создание обработчика события и сохранение ссылки на него
listenerFault = YMaps.Events.observe(ml, ml.Events.Fault, function (ml, error) {
alert('Ошибка: ' + error);
})
};

function RefreshLabel () {
map.removeOverlay (ml);

// Удаляем обработчик события
listenerFault.cleanup();
LoadLabel();
};

Результат то-же.
Даже обработчик события  совсем убрал - течет... 

Тема закрыта.
Реализовал используя AJAX.
Спасибо Саше Белому за подсказку.