чтобы просить XML продолжительную начать новый отложенный запрос через setTimeout
Вам потребуется некоторое отчетливое свойство для маркеров. Как кажется, это отдельное свойство может быть позицией, потому что они являются статическими.
Создайте объект, в котором вы храните маркеры, и используйте строковое представление положения маркера в качестве ключей.
Для получения XML вы можете, конечно, использовать AJAX (когда XML приходит из другого домена, он должен либо отправить соответствующий Access-Control-Allow-Origin
-header, либо использовать собственный прокси-скрипт на своем собственном сервере, который пересылает XML) ,
Чтобы обновить контент, используйте метод setContent()
infoBubble (используйте желаемый контент в качестве первого аргумента функции).
Примечание: если информационная банка уже открыта, вы должны вызвать метод infoBubble updateContent_()
, иначе контент будет обновлен, когда в следующий раз откроется инфо-банк. Вы можете использовать метод isOpen()
, чтобы проверить, открыт ли инфо-банк.
Образец-реализация:
Функция, которая запрашивает XML:
function downloadUrl(url,//URL of the XML-file
callback,//function 2 execute
map//the map
) {
var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP')
: new XMLHttpRequest;
request.onreadystatechange = function() {
if (request.readyState == 4) {
request.onreadystatechange = function() {};
callback(request, request.status, url, map, callback);
}
};
request.open('GET', url, true);
request.send(null);
}
Функция, которая обрабатывает ответ (используемый в качестве callback
-argument функции выше). Пока не ясно, как XML выглядит, функция требует следующее (вы, вероятно, необходимо изменить его на основе данного XML):
- элементы, которые содержат свойства для каждого маркера/пузырем имеют имя узла
event
- широта хранится в атрибут элементы
lat
- долготы хранится в атрибут элементы
lng
- название/подпись/whateve события хранится в элементы атрибутов
name
- содержимое будет textContent элемента , например.
Sample-XML:
<events>
<event lat="41.8781136" lng="-87.629798" name="Bulls vs. Mavericks">1:0</event>
</events>
function xhrCallback(r, //the request
s, //request-status
u, //request-url
m, //map
c //callback
) {
var events = r.responseXML.getElementsByTagName('event');
if (!m.markers) {
//here we store the markers
m.markers = {};
}
//will be used later to remove markers which will not exist in the XML
var keys=Object.keys(m.markers);
for (var i = 0; i < events.length; ++i) {
//the current XML-node
var event = events[i],
position = new google.maps.LatLng(event.getAttribute('lat'),
event.getAttribute('lng')),
hash = position.toString(),
content = '<h2>' + event.getAttribute('name') + '</h2>' +
event.firstChild.data;
//when the hash doesn't exist in m.markers
if (!m.markers[hash]) {
//create a new marker & infobubble
m.markers[hash] = new google.maps.Marker({
map: m,
position: position,
bubble: new InfoBubble({
content: content
})
});
google.maps.event.addListener(m.markers[hash], 'click', function() {
this.bubble.open(this.getMap(), this)
});
google.maps.event.trigger(m.markers[hash], 'click');
} else {
m.markers[hash].bubble.setContent(content);
if (m.markers[hash].bubble.isOpen()) {
m.markers[hash].bubble.updateContent_();
}
//remove the current hash from the keys-array
(function(h){
var index=keys.indexOf(h);
if(index>=0){
keys.splice(index,1);
}
}(hash));
}
}
//remove markers and bubbles which doesn't exist in the XML
keys.forEach(function(k){
m.markers[k].setMap(null);
m.markers[k].bubble.close();
delete m.markers[k];
});
//new request
setTimeout(function() {
downloadUrl(u, c, m)
},
10000//delay in milliseconds
);
}
Чтобы выполнить это называют 1 раз:
downloadUrl('path/to/file.xml',
xhrCallback,//function from above
map//your google.maps.Map
);
Демо: http://jsfiddle.net/doktormolle/fwk5e1nq/
Демо просто устанавливает содержимое в текущее время, но контент будет извлекаться через AJAX.
вы увидите, что маркеры/пузырьки иногда исчезают, это происходит, когда есть маркеры/пузырьки в карте, которая не будет присутствовать в обновленном формате XML (скрипт удалит их)
Пример прокси-скрипт:
<?php
$url='http://external.service.com/path/to/the.xml';
header('Content-Type:text/xml');
die(file_get_contents($url));
?>
Пожалуйста, пост примера для XML –
XML-настоящее время я использую привязано к спортивным событиям, так что данные не будут автоматически исх пока игра не начнется. – John
Ищите «тикер: null, // setTimeout reference» и 'setTimeout' в ответе, который вы связали.и для 'delay: 10000, // (миллисекунды) интервал между последовательными get' – DanFromGermany