Обновление AJAX, синхронизация setInterval и сбой локального хоста

Я работаю над приложением, используя Django, Leaflet, OSM и jQuery. Приложение отображает карту с маркерами и таблицу со всеми данными маркеров (время, широта, долгота).

Я хочу автоматически обновлять таблицу и маркеры карты без перезагрузки всей страницы (в основном я хочу устранить flickr слоя фрагментов карты, а база данных постоянно обновляется некоторыми случайно сгенерированными данными внутри model.py), но я столкнулся со следующими проблемами.

  1. Когда я использую refresh() только для элемента table div, каким-то образом весь мой элемент div-оболочки рекурсивно встраивается в элемент div таблицы, и все (и карта, и таблица) обновляются.

  2. Я написал функцию updateMarker() для обновления своих маркеров, но, похоже, она не работает.

  3. У меня есть временной интервал setInterval, равный 5 секундам, но на самом деле div не обновляется каждые 5 секунд. Скорее каждые 1/2 секунды или что-то слишком быстро.

  4. Поскольку мое приложение подключается к OSM для фрагментов карты, могут ли все эти запросы «GET» потреблять мою пропускную способность? Дав программе поработать какое-то время, я понял, что больше не могу загружать Google, а Wi-Fi по-прежнему работал. Через некоторое время локальный хост начал падать как сумасшедший. Я дважды перезагружал свой компьютер и 5 раз проверял настройки Интернета, и локальный хост все еще падает, когда у меня включены сценарии, связанные с картой. Однако, когда я комментирую часть кода карты, мой локальный хост по большей части выглядит нормально, просто немного прерывисто, и проблема № 3 все еще остается.

  5. РЕДАКТИРОВАТЬ: добавление к # 4, каждый раз, когда я запускаю сервер запуска сейчас (с кодом, связанным с картой), вывод терминала зависает на [14/Aug/2013 03:42:01] "GET /static/js/jquery-1.10.2.min.map HTTP/1.1" 404 1744, а локальный хост просто идет Aw, Snap. :(

    БОЛЬШЕ РЕДАКТИРОВАТЬ: ЭТО ТОЛЬКО ИСПРАВЛЕНО??! я ничего не делал...

EDITED обновляет код AJAX:

function refresh() {
    $.ajax({
        url: '/#table',
        success: function(data) {
            $('#result').html(data); //adding an extra #result div to wrap #table
            setInterval(refresh, 5000); //actually setting the refresh rate to 5s...
        }
    });
}

setInterval(refresh, 5000);

EDITED updateMarkers внутри моего файла .js,

// group markers to a layer and add the layer to map
function updateMarkers(LatLngArray) {

    // if (myLayer){
    //  map.removeLayer(myLayer);
    // }
    $.ajax({
        url:'/#map',
        success: function(){
            for (i=1;i<=LatLngArray.length;i++) {
                myIcon = L.icon({iconUrl: 'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld='+i+'|666699|FFFFFF'});
                layArray.push(L.marker([LatLngArray[i].lat, LatLngArray[i].lng], {icon: myIcon}).bindPopup('<center><br>[LatLngArray[i].lat, LatLngArray[i].lng}}]</center>'));
            }
            myLayer = L.layerGroup(layArray);
            map.addLayer(myLayer);
        }
    });
}

Еще один несколько актуальный вопрос. Я следовал руководству по брошюре OSM, чтобы попытаться установить добавлена ​​функция «показ маркера при панорамировании пользователем», но она не работает. Когда я перемещаюсь по карте, скажем, начиная с США и двигаясь на восток, пока я снова не увижу США, все мои маркеры, которые были на США с другой стороны, больше не видны. Я буквально просто скопировал код. Внутри функции initmap() это выглядит так:

function initmap() {
    // create the tile layer with correct attribution
    var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
    var osmAttrib='Map data © OpenStreetMap contributors';
    var osm = new L.TileLayer(osmUrl, {minZoom: 2, maxZoom: 15, attribution: osmAttrib});       

    // start the map centering around the mediterrean
    map = new L.Map('map', {
        center: new L.LatLng(37.16, 18.87),
        zoom: 2,
        layers: [osm]
    });

    askForPlots();
    map.on('moveend', onMapMove);
}

Извините за длинный пост... В данный момент я мало что могу сделать, так как мой хром все еще показывает Aw, Snap!


person essicajayc    schedule 14.08.2013    source источник
comment
Можете вкратце описать, что должны делать маркеры? Я немного запутался в них (также я не знаю листовки и osm :) )   -  person Entity Black    schedule 14.08.2013
comment
Я только что понял, что-то действительно глупо! Я забыл свой вызов ajax в моей функции updateMarkers. Эти маркеры представляют собой булавки на карте, такие как булавки A и B на карте Google.   -  person essicajayc    schedule 14.08.2013


Ответы (1)


Такой длинный пост О.о.

Начнем с When I use refresh() on only the table div...

Вы уверены в своей функции ajax? Я бы предпочел сделать что-то вроде этого:

function refresh() {
    $.ajax({
        url: '/ #table', // this should grab only #table element...
        success: function(data) {
            // ...and it will insert it inside #result element
            $('#result').html(data); 
            setTimeout(refresh, 5000);
        }
    });
}

setTimeout(refresh, 5000);

обновление структуры html:

<div id="result">
    <div id="table">
        ...
person Entity Black    schedule 14.08.2013
comment
Ваааааа, это сработало! Спасибо!!! Сначала у меня было «#table» вместо «/#table» внутри аргумента URL, и он сломался... поэтому я избавился от него. Дополнительный setTimeout внутри функции ajax также устранил мою проблему № 3. Зачем нам нужен результирующий div вне таблицы? Почему мы не можем просто сохранить его обратно в #table? - person essicajayc; 14.08.2013
comment
Поскольку результат вызова ajax включает сам элемент таблицы div #, а не только его содержимое. Таким образом, один из вариантов — использовать некоторый родительский элемент-оболочку (например, результат), который вы можете заполнить новыми данными. У вас есть еще много вариантов. Это не очень элегантно, но очень понятно и просто программируется... - person Entity Black; 14.08.2013
comment
Я просто раскомментировал свой код, связанный с картой, и рекурсивный феномен вернулся. Но что-то изменилось. Разделы карты и таблицы больше не втиснуты в раздел таблицы; они находятся в соответствующих контейнерах. Теперь под ними есть только дополнительный div карты. - person essicajayc; 14.08.2013